{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "import imageio\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "import sys\n",
    "import tarfile\n",
    "from IPython.display import display, Image\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from six.moves.urllib.request import urlretrieve\n",
    "from six.moves import cPickle as pickle\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "url = 'https://commondatastorage.googleapis.com/books1000/'\n",
    "last_percent_reported = None\n",
    "data_root = './dataset'  # Change me to store data elsewhere\n",
    "\n",
    "\n",
    "def download_progress_hook(count, blockSize, totalSize):\n",
    "    \"\"\"A hook to report the progress of a download. This is mostly intended for users with\n",
    "  slow internet connections. Reports every 5% change in download progress.\n",
    "  \"\"\"\n",
    "    global last_percent_reported\n",
    "    percent = int(count * blockSize * 100 / totalSize)\n",
    "\n",
    "    if last_percent_reported != percent:\n",
    "        if percent % 5 == 0:\n",
    "            sys.stdout.write(\"%s%%\" % percent)\n",
    "            sys.stdout.flush()\n",
    "        else:\n",
    "            sys.stdout.write(\".\")\n",
    "            sys.stdout.flush()\n",
    "\n",
    "        last_percent_reported = percent\n",
    "\n",
    "\n",
    "def maybe_download(filename, expected_bytes, force=False):\n",
    "    \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n",
    "    dest_filename = os.path.join(data_root, filename)\n",
    "    if force or not os.path.exists(dest_filename):\n",
    "        print('Attempting to download:', filename)\n",
    "        filename, _ = urlretrieve(url + filename,\n",
    "                                  dest_filename,\n",
    "                                  reporthook=download_progress_hook)\n",
    "        print('\\nDownload Complete!')\n",
    "    statinfo = os.stat(dest_filename)\n",
    "    if statinfo.st_size == expected_bytes:\n",
    "        print('Found and verified', dest_filename)\n",
    "    else:\n",
    "        raise Exception('Failed to verify ' + dest_filename +\n",
    "                        '. Can you get to it with a browser?')\n",
    "    return dest_filename\n",
    "\n",
    "\n",
    "train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\n",
    "test_filename = maybe_download('notMNIST_small.tar.gz', 8458043)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_classes = 10\n",
    "np.random.seed(133)\n",
    "\n",
    "\n",
    "def maybe_extract(filename, force=False):\n",
    "    root = os.path.splitext(os.path.splitext(filename)[0])[0]  # remove .tar.gz\n",
    "    if os.path.isdir(root) and not force:\n",
    "        # You may override by setting force=True.\n",
    "        print('%s already present - Skipping extraction of %s.' %\n",
    "              (root, filename))\n",
    "    else:\n",
    "        print('Extracting data for %s. This may take a while. Please wait.' %\n",
    "              root)\n",
    "        tar = tarfile.open(filename)\n",
    "        sys.stdout.flush()\n",
    "        tar.extractall(data_root)\n",
    "        tar.close()\n",
    "    data_folders = [\n",
    "        os.path.join(root, d) for d in sorted(os.listdir(root))\n",
    "        if os.path.isdir(os.path.join(root, d))\n",
    "    ]\n",
    "    if len(data_folders) != num_classes:\n",
    "        raise Exception(\n",
    "            'Expected %d folders, one per class. Found %d instead.' %\n",
    "            (num_classes, len(data_folders)))\n",
    "    print(data_folders)\n",
    "    return data_folders\n",
    "\n",
    "\n",
    "train_folders = maybe_extract(train_filename)\n",
    "test_folders = maybe_extract(test_filename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:00:00.510754Z",
     "start_time": "2020-04-12T07:00:00.505210Z"
    }
   },
   "outputs": [],
   "source": [
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# `notMNIST`数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:00:04.202738Z",
     "start_time": "2020-04-12T07:00:04.192391Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(['../H/datasets/notMNIST_large/A',\n",
       "  '../H/datasets/notMNIST_large/B',\n",
       "  '../H/datasets/notMNIST_large/C',\n",
       "  '../H/datasets/notMNIST_large/D',\n",
       "  '../H/datasets/notMNIST_large/E',\n",
       "  '../H/datasets/notMNIST_large/F',\n",
       "  '../H/datasets/notMNIST_large/G',\n",
       "  '../H/datasets/notMNIST_large/H',\n",
       "  '../H/datasets/notMNIST_large/I',\n",
       "  '../H/datasets/notMNIST_large/J'],\n",
       " ['../H/datasets/notMNIST_small/A',\n",
       "  '../H/datasets/notMNIST_small/B',\n",
       "  '../H/datasets/notMNIST_small/C',\n",
       "  '../H/datasets/notMNIST_small/D',\n",
       "  '../H/datasets/notMNIST_small/E',\n",
       "  '../H/datasets/notMNIST_small/F',\n",
       "  '../H/datasets/notMNIST_small/G',\n",
       "  '../H/datasets/notMNIST_small/H',\n",
       "  '../H/datasets/notMNIST_small/I',\n",
       "  '../H/datasets/notMNIST_small/J'])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 本地文件地址\n",
    "\n",
    "train_root = '../H/datasets/notMNIST_large/'\n",
    "train_folders = [\n",
    "    os.path.join(train_root, d) for d in sorted(os.listdir(train_root))\n",
    "    if os.path.isdir(os.path.join(train_root, d))\n",
    "]\n",
    "test_root = '../H/datasets/notMNIST_small/'\n",
    "test_folders = [\n",
    "    os.path.join(test_root, d) for d in sorted(os.listdir(test_root))\n",
    "    if os.path.isdir(os.path.join(test_root, d))\n",
    "]\n",
    "\n",
    "train_folders,test_folders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:00:29.670976Z",
     "start_time": "2020-04-12T07:00:29.485874Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A:52912\n",
      "B:52912\n",
      "C:52912\n",
      "D:52912\n",
      "E:52912\n",
      "F:52912\n",
      "G:52912\n",
      "H:52912\n",
      "I:52912\n",
      "J:52911\n"
     ]
    }
   ],
   "source": [
    "# 训练集样本量\n",
    "\n",
    "for folder in train_folders:\n",
    "    label = folder[-1]\n",
    "    num = len(os.listdir(folder))\n",
    "    print('{}:{}'.format(label, num))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A:1873\n",
      "B:1873\n",
      "C:1873\n",
      "D:1873\n",
      "E:1873\n",
      "F:1873\n",
      "G:1872\n",
      "H:1872\n",
      "I:1872\n",
      "J:1872\n"
     ]
    }
   ],
   "source": [
    "# 测试集样本量\n",
    "\n",
    "for folder in test_folders:\n",
    "    label = folder[-1]\n",
    "    num = len(os.listdir(folder))\n",
    "    print('{}:{}'.format(label, num))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "## 训练样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:01:41.282149Z",
     "start_time": "2020-04-12T07:01:41.275781Z"
    }
   },
   "outputs": [],
   "source": [
    "from IPython.display import Image, HTML, display\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:02:20.883530Z",
     "start_time": "2020-04-12T07:02:20.696461Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/RnJlZWRvbSA5IEJvbGQudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/UGFsZXJtby1SZWd1bGFyLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/RWxsaW5ndG9uTVQtSXRhbGljLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/RlogVU5JUVVFIDEwIFdBVkVZIEVYLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/U2luYWxvYSBSZWd1bGFyLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/VmVyb25lc2VCb2xkVGFiLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/QmVydGhvbGRTY3JpcHQtTWVkaXVtLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/S29yaW5uYUVGLVJlZ3VsYXIub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/WnVyaWNoIEdyZWVrIEJvbGQgSW5jbGluZWQgQlQudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/U3RhclRyZWtDbGFzc2ljTW92aWVzLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/Um9sYW5kVEIzMDMub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/WmFwIFJheWd1biBWMi4wIEl0YWxpYy50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/QXZhbnQgSXRhbGljLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/U3ltYm9sRUYtQm9va0l0YWxpYy5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/SHVtYW5pc3QtUmVndWxhci5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/A/R2FsYXh5IE1vbmtleS50dGY=.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/SVRDIEx1YmFsaW4gR3JhcGggRXh0cmEgTGlnaHQgT2JsaXF1ZS5wZmI=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/Qml0c3RyZWFtIENvb3BlciBCbGFjay5wZmI=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/U2NobmVpZGxlckVGLU1lZGl1bUl0YWxpYy5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/TGlvbmhlYXJ0IFNoYWRvdy50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/QWlyIEZsb3cgQlROIEh2LnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/UGZfdmVyeXZlcnliYWRmb250NyBPdXRsaW5lLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/UGhpbGFkZWxwaGlhLUNyYWNrZWQtQ29uZGVuc2VkIE5vcm1hbC50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/V2hpdGVOb1N1Z2FyLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/Sm9obiBEb2UudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/Q29uY29yZGVCRS1Db25kZW5zZWQub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/TWlnaHR5V2luZHlCbGFjay50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/UGFpZ2Uub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/V2Fja3kgU3BhbmtlcnMudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/SVRDQXZhbnRHYXJkZVN0ZC1EZW1pQ24ub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/S2FiZWwgQmQtTm9ybWFsLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/B/RWxlcGhhbnQgQm9sZEl0YWxpYy50dGY=.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/RG9tZXN0b3M5OC1CbGFjay5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/U2V2ZW5TYW5zSUNHLUJvbGQudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/UnVuZGlnUGVuY2lsIE5vcm1hbC50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/UGVuY2lsSW4udHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/QWFjaGVuIEQgRUUgTWVkaXVtLnBmYg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/R3JhaWxMaWdodCBSZWd1bGFyLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/SG9tZSBTdHlsZSBGaWxsLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/SHVtYW5hU2VyaWZJVENTdGQtTWVkaXVtLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/U291dmVuaXJHb3RoaWMtSXRsLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/SW50ZXJzdGF0ZS1UaGluLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/Wm9yb2FzdGVyLVJlZ3VsYXIub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/QmVsbE1UU3RkLVNlbWlCb2xkSXRhbGljLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/R3JvdGVzcXVlTVQtTGlnaHQub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/QnJvb2tzY3JpcHRXaWRlIFJlZ3VsYXIudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/TmV1dHJhZmFjZUNvbmRlbnNlZC1UaXRsaW5nLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/C/U3RhbXBGb250Lm90Zg==.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/VmFyYmVlLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/UHVja2ZvbnQudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/UmlhbHRvU0NhcHNTU0sgQm9sZEl0YWxpYy50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/UmF3bGluc29uIEJvbGQgSXRhbGljLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/VW5pdmVyc0JRLUJvbGQub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/T2ZmaWNpbmFTZXJJVEMtRXh0cmFCb2xkT1Mub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/Um9ja2V0NzAub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/SG9ybGV5T2xkU3R5bGVNVFN0ZC1MaWdodC5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/QWxwaW5lIDc1NThTLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/RXBzeSBTYW5zIEl0YWxpYy50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/SGFtYnVyZy1MaWdodC5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/QmVybmhhcmRNb2Rlcm5CVC1JdGFsaWMub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/V2VpZGVtYW5uU3RkLUJvbGQub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/RW5nZWJyZWNodHJlIEV4cGFuZGVkLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/UXVhbnR1bS50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/D/QmlyY2hTdGQub3Rm.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/VU5EQS1BbmdsZUZpbmVJdGFsaWMub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/VG9rZW4udHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/RGlzdGFudCBHYWxheHkgQ29uZGVuc2VkLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/UGxhaW5QZW5zbGVYQm9sZCBJdGFsaWMudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/S25vY2tvdXQtSW5pdGlhbHMub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/TGVNb25kZUxpdnJlLUl0YWxpYy5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/Q29sbGFnZSBCb2xkLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/Q29udGV4dCBSZXByaXNlIExpZ2h0IFNTaSBFeHRyYSBMaWdodCBJdGFsaWMudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/RGF4Q29uZGVuc2VkLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/S2lkIEtvc21pYyBCb2xkLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/Q3JpZmZlZS50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/TWVyaWRpZW5MVFN0ZC1NZWRpdW0ub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/Uml2ZXJzaWRlKDIpLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/RmFzdCA5OS50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/SmFuaWVIbWsudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/E/Qm9uZXJpYmJvbiBCb2xkLnR0Zg==.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/QnJhZ2FuemFTQ0lUQy1MaWdodC5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/Q0NBc3Ryb0NpdHlJbnQtQm9sZEl0YWxpYy50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/VW5aaWFsaXNoLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/SnVsaXVzIFByaW1hcnkgU3RkIEl0YWxpYy5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/Tm9mcmV0QlEtUmVndWxhci5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/Q291cmllci1PYmxpcXVlLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/RWd5cHRpYW4udHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/Q2hyaXN0aWFuYSBCb2xkLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/Qm9kb25pIEV4dGVuZGVkLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/Q2F4dG9uIExUIEJvbGQgSXRhbGljLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/SG91c2VHb3RoaWNIRzIzRXh0LUxJR0hUNC5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/SGVsdmV0aWNhLUxpZ2h0T2JsaXF1ZS5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/SW5mb09mZmljZS1OdW1iZXJzT25lLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/RWlnaHQgVHJhY2sgcHJvZ3JhbSA0LnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/QXJjaGVyeSBCbGFjayBPdXRsaW5lIEl0YWxpYy50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/F/TGF1cmVudGlhblN0ZC1Cb2xkLm90Zg==.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/Qml4QW50aXF1ZVNjcmlwdEhtay50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/R2FsYW50IFdpZGUgQm9sZEl0YWxpYy50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/Q2hpdmFscnlJVENTdGQub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/RnJvemVuRG9nVHJlYXRzLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/VmVjdG9yYSBMSCA0NiBMaWdodCBJdGFsaWMucGZi.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/Q2Fzc2FuZHJlRUYtSW5pdGlhbHMub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/VXNoZXJ3b29kU3RkLUJvb2sub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/QW1lcmljYW5VbmNJbmlELm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/QmlnIENodW1wIEJUTiBDb25kLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/U0YgRWNjZW50cmljIE9wdXMgQ29uZGVuc2VkIE9ibGlxdWUudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/Q2VudHVyeU9sZHN0eWxlSUNHSXRhbGljLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/Q2xpZmZvcmRFaWdodGVlbi1JdGFsaWMub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/QXRtYW4gZGluZ3MudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/QXZhbnRHYXJkZU1kSVRDLU9ibGlxdWUub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/Q2FudG9yaWFNVFN0ZC1Cb2xkSXRhbGljLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/G/TW9yZ2FuQmlnLUJsYWNrSXRhbGljLm90Zg==.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/QWJyYXpvU2NyaXB0U1NLIEJvbGQudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/QWxsZW5zSGFuZCBSZWd1bGFyLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/RWxsaW5ndG9uTVRTdGQtRXh0cmFCb2xkLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/VXB0aWdodCBMZWZ0aS50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/R2FydGhHcmFwaGljLUl0YWxpYy5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/RGF2aWRhRC50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/Vm9ubmVzLUV4Ym9sZENvbmRlbnNlZC5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/V2ljaGl0YS1SZWd1bGFyLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/VG9tYm95TGlnaHQub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/R291ZHlUaGlydHlIVy5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/SW1wZXJhdG9yU21hbGxDYXBzLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/R3Jvc3NvdXQgU2hhZG93LnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/QXJpc3RvbkJRLUJvbGQub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/TFRBdXRoZW50aWNTYW5zLUJsYWNrSXRhbGljLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/QWRhbXMgV2lkZSBCb2xkIEl0YWxpYy50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/H/THVjaWRhQ2FzdWFsRUYtSXRhbGljLm90Zg==.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/QWxwaGFiZXQ0LVNtYWxsQ2Fwcy5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/RWFyd2F4IFdpdC50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/QXJteUNoYWxrLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/Sm91cm5hbFRleHRBLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/UVRMYXV0cmVjVHlwZSBSZWd1bGFyLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/TGVhd29vZEVGLUJsYWNrSXRhbGljLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/Um9yeSBXaWRlIE5vcm1hbC50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/TWVyY3VyeU51bWVyaWNHMi1Cb2xkLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/QWdhaW4gYW5kIEFnYWluLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/SGVycmlja3NIYW5kIFJlZ3VsYXIudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/RWlkZXRpY05lby1TbWFsbENhcHMub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/VHJpbml0ZU5vMS1Sb21hbldpZGVUYWIub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/QXJtYWdnZWRvbiBJbmR1c3RyaWFsLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/Sm9obm55LUxpZ2h0IEhvLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/R2VvcmdpYS50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/I/TWF4TEYtRXh0cmFCb2xkLm90Zg==.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/QmVtYm9Cb29rTVRTdGQtQm9sZC5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/TmV3dGV4dEJvb2tJdGFsaWMub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/RHluYW1pYyBSZWNvbXBpbGF0aW9uLnR0Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/UmVndWxhdG9yLVRoaW4ub3Rm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/SVRDR2FyYW1vbmRTdGQtQmtDb25kLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/TGlsaXRoLUxpZ2h0IFJlZ3VsYXIudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/SmVubmVyaWtJbmZtbCBQbGFpbi50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/U3dpc3MgNzIxIExpZ2h0IEl0YWxpYyBCVC50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/TENEIE5vcm1hbC50dGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/RHluYW1vRHhjSXRhbGljQlhDLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/QS5DLk0uRS4gRXhwbG9zaXZlIEJvbGQudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/UGxhbnRpbkluZmFudE1UU3RkLUJvbGRJdC5vdGY=.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/U2NhbXAtRmF0Lm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/U3ltYm9sRUYtTWVkaXVtSXRhbGljLm90Zg==.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/TGVvIENvbmRlbnNlZCBOb3JtYWwudHRm.png' /><img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='../H/datasets/notMNIST_large/J/Qm9yZGVyIEJhc2UgRnV0dXJlLnR0Zg==.png' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 每类样本图片\n",
    "\n",
    "for folder in train_folders:\n",
    "    images = os.listdir(folder)\n",
    "    samples = random.sample(images, 16)\n",
    "    samples_path = [os.path.join(folder, name) for name in samples]\n",
    "    imagesList = ''.join([\n",
    "        \"<img style='width: 32px; margin: 5px; float: left; border: 1px solid black;' src='%s' />\"\n",
    "        % str(s) for s in samples_path\n",
    "    ])\n",
    "    display(HTML(imagesList))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理\n",
    "- 将图片分批\n",
    "- 将图片集转化为 3D 数组，并正则化，并按图片类别保存"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:20:32.921814Z",
     "start_time": "2020-04-12T07:20:32.916478Z"
    }
   },
   "source": [
    "### 图片转换成`pickle`文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:11:21.489010Z",
     "start_time": "2020-04-12T07:11:21.482965Z"
    }
   },
   "outputs": [],
   "source": [
    "import imageio\n",
    "from six.moves import cPickle as pickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:13:18.542637Z",
     "start_time": "2020-04-12T07:11:48.926850Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pickling ../H/datasets/notMNIST_large/A.pickle.\n",
      "../H/datasets/notMNIST_large/A\n",
      "Could not read: ../H/datasets/notMNIST_large/A/SG90IE11c3RhcmQgQlROIFBvc3Rlci50dGY=.png : Could not find a format to read the specified file in single-image mode - it's ok, skipping.\n",
      "Could not read: ../H/datasets/notMNIST_large/A/Um9tYW5hIEJvbGQucGZi.png : Could not find a format to read the specified file in single-image mode - it's ok, skipping.\n",
      "Could not read: ../H/datasets/notMNIST_large/A/RnJlaWdodERpc3BCb29rSXRhbGljLnR0Zg==.png : Could not find a format to read the specified file in single-image mode - it's ok, skipping.\n",
      "Full dataset tensor: (52909, 28, 28)\n",
      "Mean: -0.12825029\n",
      "Standard deviation: 0.4431206\n",
      "Pickling ../H/datasets/notMNIST_large/B.pickle.\n",
      "../H/datasets/notMNIST_large/B\n",
      "Could not read: ../H/datasets/notMNIST_large/B/TmlraXNFRi1TZW1pQm9sZEl0YWxpYy5vdGY=.png : Could not find a format to read the specified file in single-image mode - it's ok, skipping.\n",
      "Full dataset tensor: (52911, 28, 28)\n",
      "Mean: -0.007563046\n",
      "Standard deviation: 0.45449165\n",
      "Pickling ../H/datasets/notMNIST_large/C.pickle.\n",
      "../H/datasets/notMNIST_large/C\n",
      "Full dataset tensor: (52912, 28, 28)\n",
      "Mean: -0.14225793\n",
      "Standard deviation: 0.43980625\n",
      "Pickling ../H/datasets/notMNIST_large/D.pickle.\n",
      "../H/datasets/notMNIST_large/D\n",
      "Could not read: ../H/datasets/notMNIST_large/D/VHJhbnNpdCBCb2xkLnR0Zg==.png : Could not find a format to read the specified file in single-image mode - it's ok, skipping.\n",
      "Full dataset tensor: (52911, 28, 28)\n",
      "Mean: -0.05736782\n",
      "Standard deviation: 0.45564777\n",
      "Pickling ../H/datasets/notMNIST_large/E.pickle.\n",
      "../H/datasets/notMNIST_large/E\n",
      "Full dataset tensor: (52912, 28, 28)\n",
      "Mean: -0.06989898\n",
      "Standard deviation: 0.45294145\n",
      "Pickling ../H/datasets/notMNIST_large/F.pickle.\n",
      "../H/datasets/notMNIST_large/F\n",
      "Full dataset tensor: (52912, 28, 28)\n",
      "Mean: -0.12558305\n",
      "Standard deviation: 0.4470894\n",
      "Pickling ../H/datasets/notMNIST_large/G.pickle.\n",
      "../H/datasets/notMNIST_large/G\n",
      "Full dataset tensor: (52912, 28, 28)\n",
      "Mean: -0.094581515\n",
      "Standard deviation: 0.44624022\n",
      "Pickling ../H/datasets/notMNIST_large/H.pickle.\n",
      "../H/datasets/notMNIST_large/H\n",
      "Full dataset tensor: (52912, 28, 28)\n",
      "Mean: -0.068522066\n",
      "Standard deviation: 0.4542317\n",
      "Pickling ../H/datasets/notMNIST_large/I.pickle.\n",
      "../H/datasets/notMNIST_large/I\n",
      "Full dataset tensor: (52912, 28, 28)\n",
      "Mean: 0.030786246\n",
      "Standard deviation: 0.46889865\n",
      "Pickling ../H/datasets/notMNIST_large/J.pickle.\n",
      "../H/datasets/notMNIST_large/J\n",
      "Full dataset tensor: (52911, 28, 28)\n",
      "Mean: -0.15335836\n",
      "Standard deviation: 0.4436564\n",
      "Pickling ../H/datasets/notMNIST_small/A.pickle.\n",
      "../H/datasets/notMNIST_small/A\n",
      "Could not read: ../H/datasets/notMNIST_small/A/RGVtb2NyYXRpY2FCb2xkT2xkc3R5bGUgQm9sZC50dGY=.png : Could not find a format to read the specified file in single-image mode - it's ok, skipping.\n",
      "Full dataset tensor: (1872, 28, 28)\n",
      "Mean: -0.13262632\n",
      "Standard deviation: 0.445128\n",
      "Pickling ../H/datasets/notMNIST_small/B.pickle.\n",
      "../H/datasets/notMNIST_small/B\n",
      "Full dataset tensor: (1873, 28, 28)\n",
      "Mean: 0.005356082\n",
      "Standard deviation: 0.45711535\n",
      "Pickling ../H/datasets/notMNIST_small/C.pickle.\n",
      "../H/datasets/notMNIST_small/C\n",
      "Full dataset tensor: (1873, 28, 28)\n",
      "Mean: -0.14152056\n",
      "Standard deviation: 0.44269025\n",
      "Pickling ../H/datasets/notMNIST_small/D.pickle.\n",
      "../H/datasets/notMNIST_small/D\n",
      "Full dataset tensor: (1873, 28, 28)\n",
      "Mean: -0.049216665\n",
      "Standard deviation: 0.45975888\n",
      "Pickling ../H/datasets/notMNIST_small/E.pickle.\n",
      "../H/datasets/notMNIST_small/E\n",
      "Full dataset tensor: (1873, 28, 28)\n",
      "Mean: -0.05991474\n",
      "Standard deviation: 0.45734966\n",
      "Pickling ../H/datasets/notMNIST_small/F.pickle.\n",
      "../H/datasets/notMNIST_small/F\n",
      "Could not read: ../H/datasets/notMNIST_small/F/Q3Jvc3NvdmVyIEJvbGRPYmxpcXVlLnR0Zg==.png : Could not find a format to read the specified file in single-image mode - it's ok, skipping.\n",
      "Full dataset tensor: (1872, 28, 28)\n",
      "Mean: -0.11818534\n",
      "Standard deviation: 0.45227864\n",
      "Pickling ../H/datasets/notMNIST_small/G.pickle.\n",
      "../H/datasets/notMNIST_small/G\n",
      "Full dataset tensor: (1872, 28, 28)\n",
      "Mean: -0.09255034\n",
      "Standard deviation: 0.44900584\n",
      "Pickling ../H/datasets/notMNIST_small/H.pickle.\n",
      "../H/datasets/notMNIST_small/H\n",
      "Full dataset tensor: (1872, 28, 28)\n",
      "Mean: -0.05868924\n",
      "Standard deviation: 0.45875892\n",
      "Pickling ../H/datasets/notMNIST_small/I.pickle.\n",
      "../H/datasets/notMNIST_small/I\n",
      "Full dataset tensor: (1872, 28, 28)\n",
      "Mean: 0.052645046\n",
      "Standard deviation: 0.47189337\n",
      "Pickling ../H/datasets/notMNIST_small/J.pickle.\n",
      "../H/datasets/notMNIST_small/J\n",
      "Full dataset tensor: (1872, 28, 28)\n",
      "Mean: -0.15168917\n",
      "Standard deviation: 0.44801363\n"
     ]
    }
   ],
   "source": [
    "image_size = 28  # Pixel width and height.\n",
    "pixel_depth = 255.0  # Number of levels per pixel.\n",
    "\n",
    "\n",
    "# 指定文件夹，加载其中图片\n",
    "def load_letter(folder, min_num_images):\n",
    "    \"\"\"Load the data for a single letter label.\"\"\"\n",
    "    image_files = os.listdir(folder)\n",
    "    dataset = np.ndarray(\n",
    "        shape=(len(image_files), image_size, image_size),\n",
    "        dtype=np.float32,\n",
    "    )\n",
    "    print(folder)\n",
    "    \n",
    "    num_images = 0\n",
    "    for image in image_files:\n",
    "        image_file = os.path.join(folder, image)\n",
    "        try:\n",
    "            image_data = (imageio.imread(image_file).astype(float) -\n",
    "                          pixel_depth / 2) / pixel_depth\n",
    "            if image_data.shape != (image_size, image_size):\n",
    "                raise Exception('Unexpected image shape: %s' %\n",
    "                                str(image_data.shape))\n",
    "            dataset[num_images, :, :] = image_data\n",
    "            num_images = num_images + 1\n",
    "        except (IOError, ValueError) as e:\n",
    "            print('Could not read:', image_file, ':', e,\n",
    "                  '- it\\'s ok, skipping.')\n",
    "\n",
    "    dataset = dataset[0:num_images, :, :]\n",
    "    if num_images < min_num_images:\n",
    "        raise Exception('Many fewer images than expected: %d < %d' %\n",
    "                        (num_images, min_num_images))\n",
    "\n",
    "    print('Full dataset tensor:', dataset.shape)\n",
    "    print('Mean:', np.mean(dataset))\n",
    "    print('Standard deviation:', np.std(dataset))\n",
    "    return dataset\n",
    "\n",
    "\n",
    "# 加载所有图片，并将每个文件夹所有图片保存文pickle文件\n",
    "def maybe_pickle(data_folders, min_num_images_per_class, force=False):\n",
    "    dataset_names = []\n",
    "    for folder in data_folders:\n",
    "        set_filename = folder + '.pickle'\n",
    "        dataset_names.append(set_filename)\n",
    "        if os.path.exists(set_filename) and not force:\n",
    "            # You may override by setting force=True.\n",
    "            print('%s already present - Skipping pickling.' % set_filename)\n",
    "        else:\n",
    "            print('Pickling %s.' % set_filename)\n",
    "            dataset = load_letter(folder, min_num_images_per_class)\n",
    "            try:\n",
    "                with open(set_filename, 'wb') as f:\n",
    "                    pickle.dump(dataset, f, pickle.HIGHEST_PROTOCOL)\n",
    "            except Exception as e:\n",
    "                print('Unable to save data to', set_filename, ':', e)\n",
    "\n",
    "    return dataset_names\n",
    "\n",
    "\n",
    "train_datasets = maybe_pickle(train_folders, 45000)\n",
    "test_datasets = maybe_pickle(test_folders, 1800)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:19:41.004349Z",
     "start_time": "2020-04-12T07:19:40.998498Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['../H/datasets/notMNIST_large/A.pickle',\n",
       " '../H/datasets/notMNIST_large/B.pickle',\n",
       " '../H/datasets/notMNIST_large/C.pickle',\n",
       " '../H/datasets/notMNIST_large/D.pickle',\n",
       " '../H/datasets/notMNIST_large/E.pickle',\n",
       " '../H/datasets/notMNIST_large/F.pickle',\n",
       " '../H/datasets/notMNIST_large/G.pickle',\n",
       " '../H/datasets/notMNIST_large/H.pickle',\n",
       " '../H/datasets/notMNIST_large/I.pickle',\n",
       " '../H/datasets/notMNIST_large/J.pickle']"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_datasets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 将`pickle`数据显示为图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:14:38.079795Z",
     "start_time": "2020-04-12T07:14:37.992174Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:14:43.395895Z",
     "start_time": "2020-04-12T07:14:39.323254Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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rl27FhcuXODP5Mb37gTlEU6bNg3PPPMMunTpAkCpsC0rhHIkSWFBtMxsNmPGjBmsCOansqsrCAoKYl5/5swZAGAny72Q/7WAM95wv1aELb5Svw4dOnTo0KFDhw4dOnToKBRc9hCStn7mzBm88cYbePfddwEobm25glxOVe3k8uAUm7xz504Aiov4+PHjbLVauXIlypYtq6rqpCXknMFLly7h/PnzbLW4evUqPD09ueRv1apVERER4TQWmCxFBoMBERER7OFISEhAVlYWx/WfPn0a/v7+PL8SJUrA09OTLd9aeCjo3jNmzECrVq0wf/58AIonZtq0aWyJtdvt8PDwKPZu+o8++ohzXzZu3IgvvviCvaI2m83tniDy1rz99tsAkK1nkDvQtm1bAMArr7yCL774gs+a3W6HwWDgaoALFy7EsGHDCh0iK1vxp02bpvpMqyq5lA8WERGBEydOqLy6QgicPHkSANC4cWPeq8Dd8En6XYZjFcp7BT8/Py4VTmOiNRo5ciQ2bdrE3oeXX34ZycnJ7DWcPXs2wsLCVF5boh8UahMWFoYSJUrwPcxmM+x2O8aOHQsAiI2NZc8cUDTRADLNP3XqFIcKfvXVV+jSpUueY7h06RI+/vhj/p3yTZyBPKJEdydNmuSuaahA3pdvv/0WZ86c4TnkZUG/ffs2unbtit69e6Nfv34AlL5UPj4+nKvzzz//YNmyZVi0aBEAJWdXfkepqal466232OPx2WefuXVuwcHBXKHy4MGDOHv2LAYPHgwAmDBhgltCx2idACUlgyKDgLupKVqG91ssFpWXz9XwzgkTJmDmzJkcNXTw4EGsXbuWP9ciOsRVDB06FICyR48fP67aQz///DOv45NPPun2fmhEq7Wkt8TLN27cmOt1tBaUl/bGG2+gUqVKLqfJyDyFQtIJlPrjbhB979y5M4YOHcrpAPv370eXLl2wfPlyAMr++/fffzkcsaARUHa7nfn677//jtdee40/06KCqdwOBFDyzAGlimr37t2LfdSaHBFEHlaqRVK1atUCv1M54sldZ6zAp79s2bJITExEo0aNAAB169ZFTEwMatSoAQCIjIxEYGAgu4PT09Nx69YtnDt3jl/G3r17sW/fPlUyrMlkwr59+wAoje5Xr16tKg6g5aaw2Wwczvn7779jz549HDYTHByMcuXKce7Lgw8+iPLl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RnWBP3DgAAMGDODo0aO6z7Rp0wZACpgnguhzp9NJaWkpBw4cAKB9+/b88ssvYRujquCcn5/PRx99xLx58wDYsWOHXDirQp2jvvxPwWXAgAEAzJs3L6hzECq20XcOffjhhzzzzDMANGnShOeee47zzz8fgNTUVPle0fc5OTls3bqVL7/8EvDOsdatW/P0008D0KxZM9xud6VCnvjuULRP/O7XX38NwL333ivHjsBms8l+a968OcuWLavyfk+EUK+jYn54PB4sFgtFRUUAzJ8/n5kzZ8p1VQgsPveG2WzWbYAOh0MKdxkZGTRt2lSOyXHjxtGxY0dfI0dIx6iKpmlomibXToA///yTjRs3ArB161a+//57jh49SnFxMeBVhH3npjrmXS4XRUVF8rlFRUVRWFgo17ILLriAw4cPh7UPhYDy2muvMXPmTCkoX3HFFfTq1Yt27dqRkJAg71fTNEpLSwHIzMxk165drF+/HoD169dz+PBh+vTpA8CIESO46KKLpOD6v+cR9D786aefxHezZ88etm3bBkCvXr2kYVbgcrn4888/AWjUqBH169fXrU3i+SxevBjwKlUHDhzgjz/+ALwK82233cZFF10EHJcpBKFcZ3zx3d/37dvHvHnz5Br522+/ybFWFXa7ncaNGwNeGahPnz7069cPgI4dO1ZQmkK5zqgKnVgbN2zYAHjl002bNtGqVSsAevfuTdeuXWnevDmJiYmAV3DWNE3OyczMTH799Ve++eYbABYsWMChQ4fkdwwfPpzJkyfLcf+/OR+2dcYXsSdkZGQA8MADDzB//ny/a6pYa8rKyigtLeWuu+4CYOrUqVgsFvkZu93OV199xV9//QXAP//5z7DJ3AJVhjObzSxcuBCA+++/X+obYpzFxMRQVlYm16aSkhIKCgr45z//KduXkJCgk9F9CbU8oyKUOTEPc3JyWLp0KfPnzwdg7dq1cp+rCrHngPd5uVwuudYWFhaiaRqdOnUCvDJEZRguowYGBgYGBgYGBgYGBn9XhGYZyH/nnXee5na7NbfbrWmaph08eFDr1auX1qtXLw3QAM1kMmkmk0kzm82ayWSSr6v/mc1mzWw2azabTYuKipL/2Ww2eU19j/jczJkzNU3TNJfLpblcLk3zqsSbatKG6trni9reRx99VLPZbJrNZtNuuukm7YsvvtDWrVunrVu3Tnv9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\n",
      "text/plain": [
       "<Figure size 1152x576 with 160 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Nr = len(train_folders)\n",
    "Nc = 16\n",
    "cmap = \"binary\"\n",
    "\n",
    "fig, axs = plt.subplots(Nr, Nc, figsize=(16, 8))\n",
    "# fig.suptitle('Multiple images')\n",
    "plt.subplots_adjust(wspace=0.2, hspace=0.2)\n",
    "plt.axis('off')\n",
    "\n",
    "# images = []\n",
    "for i in range(Nr):\n",
    "    folder = train_folders[i]\n",
    "    label = folder[-1]\n",
    "    with open(folder + '.pickle', 'rb') as f:\n",
    "        dataset = pickle.load(f)\n",
    "        np.random.shuffle(dataset)\n",
    "        samples = dataset[:Nc]\n",
    "    for j in range(Nc):\n",
    "        data = samples[j]\n",
    "        axs[i, j].imshow(data, cmap=cmap)\n",
    "        axs[i, j].set_axis_off\n",
    "        axs[i, j].set_xticks([])\n",
    "        axs[i, j].set_yticks([])\n",
    "        axs[i, j].label_outer()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 训练集、验证集、测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:31:30.447478Z",
     "start_time": "2020-04-12T07:31:28.695150Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training: (200000, 28, 28) (200000,)\n",
      "Validation: (10000, 28, 28) (10000,)\n",
      "Testing: (10000, 28, 28) (10000,)\n",
      "{0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J'}\n"
     ]
    }
   ],
   "source": [
    "def make_arrays(nb_rows, img_size):\n",
    "    if nb_rows:\n",
    "        dataset = np.ndarray((nb_rows, img_size, img_size), dtype=np.float32)\n",
    "        labels = np.ndarray(nb_rows, dtype=np.int32)\n",
    "    else:\n",
    "        dataset, labels = None, None\n",
    "    return dataset, labels\n",
    "\n",
    "\n",
    "def merge_datasets(pickle_files, train_size, valid_size=0):\n",
    "    num_classes = len(pickle_files)\n",
    "    valid_dataset, valid_labels = make_arrays(valid_size, image_size)\n",
    "    train_dataset, train_labels = make_arrays(train_size, image_size)\n",
    "\n",
    "    vsize_per_class = valid_size // num_classes\n",
    "    tsize_per_class = train_size // num_classes\n",
    "\n",
    "    start_v, start_t = 0, 0\n",
    "    end_v, end_t = vsize_per_class, tsize_per_class\n",
    "    end_l = vsize_per_class + tsize_per_class\n",
    "\n",
    "    label2letter = {}\n",
    "\n",
    "    for label, pickle_file in enumerate(pickle_files):\n",
    "        # pickle_file: pickle 文件的路径，如'../H/datasets/notMNIST_large/A.pickle'\n",
    "\n",
    "        try:\n",
    "            with open(pickle_file, 'rb') as f:\n",
    "                letter_set = pickle.load(f)\n",
    "                # let's shuffle the letters to have random validation and training set\n",
    "                np.random.shuffle(letter_set)\n",
    "                if valid_dataset is not None:\n",
    "                    valid_letter = letter_set[:vsize_per_class, :, :]\n",
    "                    valid_dataset[start_v:end_v, :, :] = valid_letter\n",
    "                    valid_labels[start_v:end_v] = label\n",
    "                    start_v += vsize_per_class\n",
    "                    end_v += vsize_per_class\n",
    "\n",
    "                train_letter = letter_set[vsize_per_class:end_l, :, :]\n",
    "                train_dataset[start_t:end_t, :, :] = train_letter\n",
    "                train_labels[start_t:end_t] = label\n",
    "                start_t += tsize_per_class\n",
    "                end_t += tsize_per_class\n",
    "        except Exception as e:\n",
    "            print('Unable to process data from', pickle_file, ':', e)\n",
    "            raise\n",
    "\n",
    "    return valid_dataset, valid_labels, train_dataset, train_labels\n",
    "\n",
    "\n",
    "train_size = 200000\n",
    "valid_size = 10000\n",
    "test_size = 10000\n",
    "\n",
    "valid_dataset, valid_labels, train_dataset, train_labels = merge_datasets(\n",
    "    train_datasets,\n",
    "    train_size,\n",
    "    valid_size,\n",
    ")\n",
    "_, _, test_dataset, test_labels = merge_datasets(test_datasets, test_size)\n",
    "\n",
    "\n",
    "# 标签和字母类别\n",
    "label2letter = {\n",
    "    label: pickle_file.split('/')[-1][0]\n",
    "    for label, pickle_file in enumerate(train_datasets)\n",
    "}\n",
    "\n",
    "print('Training:', train_dataset.shape, train_labels.shape)\n",
    "print('Validation:', valid_dataset.shape, valid_labels.shape)\n",
    "print('Testing:', test_dataset.shape, test_labels.shape)\n",
    "print(label2letter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:34:29.634788Z",
     "start_time": "2020-04-12T07:34:29.629752Z"
    }
   },
   "outputs": [],
   "source": [
    "# 测试集和训练集的到的标签-字母是一致的\n",
    "assert {\n",
    "    label: pickle_file.split('/')[-1][0]\n",
    "    for label, pickle_file in enumerate(train_datasets)\n",
    "} == label2letter"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 样本的类别分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:35:12.849757Z",
     "start_time": "2020-04-12T07:35:12.840099Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train: A:20000;B:20000;C:20000;D:20000;E:20000;F:20000;G:20000;H:20000;I:20000;J:20000;\n",
      "valid: A:1000;B:1000;C:1000;D:1000;E:1000;F:1000;G:1000;H:1000;I:1000;J:1000;\n",
      "test: A:1000;B:1000;C:1000;D:1000;E:1000;F:1000;G:1000;H:1000;I:1000;J:1000;\n"
     ]
    }
   ],
   "source": [
    "def data_distribution(dataset, label2letter=label2letter):\n",
    "    for i in range(10):\n",
    "        num = len(dataset[dataset == i])\n",
    "        label = label2letter[i]\n",
    "        print(\"{}:{}\".format(label, num), end=';')\n",
    "\n",
    "\n",
    "for cat, dataset in zip(['train', 'valid', 'test'],\n",
    "                        [train_labels, valid_labels, test_labels]):\n",
    "    print(cat, end=': ')\n",
    "    data_distribution(dataset)\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 样本重排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:36:24.224202Z",
     "start_time": "2020-04-12T07:36:24.107369Z"
    }
   },
   "outputs": [],
   "source": [
    "def randomize(dataset, labels):\n",
    "    permutation = np.random.permutation(labels.shape[0])\n",
    "    shuffled_dataset = dataset[permutation, :, :]\n",
    "    shuffled_labels = labels[permutation]\n",
    "    return shuffled_dataset, shuffled_labels\n",
    "\n",
    "\n",
    "train_dataset, train_labels = randomize(train_dataset, train_labels)\n",
    "test_dataset, test_labels = randomize(test_dataset, test_labels)\n",
    "valid_dataset, valid_labels = randomize(valid_dataset, valid_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 验证数据与标签是否同步重排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:39:36.922165Z",
     "start_time": "2020-04-12T07:39:36.607806Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x288 with 20 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cmap = \"binary\"\n",
    "\n",
    "fig, axs = plt.subplots(1, 20, figsize=(16, 4))\n",
    "plt.subplots_adjust(wspace=0.2)\n",
    "plt.axis('off')\n",
    "\n",
    "for i in range(20):\n",
    "    ind = random.randint(0, 10000)\n",
    "    data = train_dataset[ind]\n",
    "    name = label2letter[train_labels[ind]]\n",
    "    axs[i].imshow(data, cmap=cmap)\n",
    "    axs[i].set_axis_off\n",
    "    axs[i].set_xticks([])\n",
    "    axs[i].set_yticks([])\n",
    "    axs[i].label_outer()\n",
    "    axs[i].set_title(name)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 保存最终数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:41:57.044540Z",
     "start_time": "2020-04-12T07:41:56.584176Z"
    }
   },
   "outputs": [],
   "source": [
    "data_root = '../H/datasets/'\n",
    "pickle_file = os.path.join(data_root, 'notMNIST.pickle')\n",
    "\n",
    "try:\n",
    "    f = open(pickle_file, 'wb')\n",
    "    save = {\n",
    "        'train_dataset': train_dataset,\n",
    "        'train_labels': train_labels,\n",
    "        'valid_dataset': valid_dataset,\n",
    "        'valid_labels': valid_labels,\n",
    "        'test_dataset': test_dataset,\n",
    "        'test_labels': test_labels,\n",
    "    }\n",
    "    pickle.dump(save, f, pickle.HIGHEST_PROTOCOL)\n",
    "    f.close()\n",
    "except Exception as e:\n",
    "    print('Unable to save data to', pickle_file, ':', e)\n",
    "    raise"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:42:12.563470Z",
     "start_time": "2020-04-12T07:42:12.558094Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Compressed pickle size: 690800506\n"
     ]
    }
   ],
   "source": [
    "statinfo = os.stat(pickle_file)\n",
    "print('Compressed pickle size:', statinfo.st_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 图片去重\n",
    "- 将图片数组大于0的数值变为1，小于0的数值变为0\n",
    "- 比较两张图片，计算相同位置处数值不相同的数量，小于某一阈值，即判定为相同的照片\n",
    "    - ***todo：太耗时，待优化***"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:46:03.338742Z",
     "start_time": "2020-04-12T07:46:02.951713Z"
    }
   },
   "outputs": [],
   "source": [
    "data_root = '../H/datasets/'\n",
    "pickle_file = os.path.join(data_root, 'notMNIST.pickle')\n",
    "with open(pickle_file, 'rb') as f:\n",
    "    data = pickle.load(f)\n",
    "    train_dataset = data['train_dataset']\n",
    "    train_labels = data['train_labels']\n",
    "    test_dataset = data['test_dataset']\n",
    "    test_labels = data['test_labels']\n",
    "    valid_dataset = data['valid_dataset']\n",
    "    valid_labels = data['valid_labels']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:46:05.415736Z",
     "start_time": "2020-04-12T07:46:05.409853Z"
    }
   },
   "outputs": [],
   "source": [
    "# 将图片像素值转化成 1 和 0\n",
    "def aHash(img_array):\n",
    "    mask = (img_array > 0).astype(int)\n",
    "    return mask.flatten()\n",
    "\n",
    "\n",
    "# 比较转化后图片像素点相同的数量\n",
    "def diff(img1, img2):\n",
    "    hash1 = aHash(img1)\n",
    "    hash2 = aHash(img2)\n",
    "    diff = np.count_nonzero(hash1 != hash2)\n",
    "    return diff"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:46:25.178529Z",
     "start_time": "2020-04-12T07:46:25.172871Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diff(train_dataset[0],train_dataset[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:46:33.472669Z",
     "start_time": "2020-04-12T07:46:33.467073Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(356, 382)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diff(train_dataset[0], train_dataset[1]), diff(train_dataset[0],\n",
    "                                               train_dataset[2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-12T07:50:12.301766Z",
     "start_time": "2020-04-12T07:50:12.295302Z"
    }
   },
   "outputs": [],
   "source": [
    "# 给定图片，暴力遍历所有图片，找出重复的图片\n",
    "def overlapping(img, dataset, mask):\n",
    "    for i in mask:\n",
    "        if diff(img, dataset[i]) < 5:\n",
    "            return i\n",
    "\n",
    "\n",
    "# 找出训练集中和验证集中重复的图片\n",
    "def find_overlappings(valid_dataset, valid_labels, train_dataset,\n",
    "                      train_labels):\n",
    "    overlapping_index = []\n",
    "\n",
    "    for i, img in enumerate(valid_dataset):\n",
    "        label = valid_labels[i]\n",
    "        mask = np.where(train_labels == label)[0]\n",
    "\n",
    "        j = overlapping(img, train_dataset, mask)\n",
    "        if j is not None:\n",
    "            overlapping_index.append((i, j))\n",
    "    return overlapping_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 32min 21s, sys: 300 ms, total: 32min 21s\n",
      "Wall time: 32min 21s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "overlapping_index = find_overlappings(valid_dataset, valid_labels,\n",
    "                                      train_dataset, train_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(1, 183513),\n",
       " (2, 50023),\n",
       " (3, 85595),\n",
       " (8, 7778),\n",
       " (18, 115172),\n",
       " (23, 93739),\n",
       " (27, 184312),\n",
       " (32, 119397),\n",
       " (37, 17642),\n",
       " (39, 27),\n",
       " (65, 93350),\n",
       " (77, 62297),\n",
       " (81, 6216),\n",
       " (82, 41547),\n",
       " (93, 32350),\n",
       " (101, 4628),\n",
       " (105, 145752),\n",
       " (113, 15312),\n",
       " (114, 77430),\n",
       " (117, 181640),\n",
       " (123, 18427),\n",
       " (124, 134197),\n",
       " (137, 3442),\n",
       " (146, 131311),\n",
       " (158, 27),\n",
       " (159, 125142),\n",
       " (163, 27),\n",
       " (169, 166088),\n",
       " (170, 13263),\n",
       " (176, 58397),\n",
       " (179, 27),\n",
       " (189, 197128),\n",
       " (192, 254),\n",
       " (212, 13145),\n",
       " (216, 30811),\n",
       " (223, 86647),\n",
       " (225, 169198),\n",
       " (227, 16658),\n",
       " (228, 6520),\n",
       " (230, 35258),\n",
       " (235, 1759),\n",
       " (243, 132131),\n",
       " (254, 188492),\n",
       " (257, 97740),\n",
       " (259, 27),\n",
       " (263, 28637),\n",
       " (274, 115884),\n",
       " (278, 106254),\n",
       " (281, 119474),\n",
       " (285, 26782),\n",
       " (293, 5024),\n",
       " (295, 6018),\n",
       " (297, 20445),\n",
       " (301, 27),\n",
       " (309, 159528),\n",
       " (320, 62363),\n",
       " (324, 22953),\n",
       " (331, 89432),\n",
       " (334, 27),\n",
       " (335, 21068),\n",
       " (343, 54603),\n",
       " (348, 7596),\n",
       " (352, 1310),\n",
       " (361, 55901),\n",
       " (365, 2916),\n",
       " (369, 27),\n",
       " (373, 71143),\n",
       " (376, 27),\n",
       " (377, 143839),\n",
       " (378, 35076),\n",
       " (379, 140421),\n",
       " (381, 182131),\n",
       " (383, 59073),\n",
       " (386, 27),\n",
       " (391, 191539),\n",
       " (402, 198020),\n",
       " (411, 196873),\n",
       " (412, 26352),\n",
       " (417, 79882),\n",
       " (433, 4020),\n",
       " (440, 136767),\n",
       " (444, 90621),\n",
       " (445, 54729),\n",
       " (449, 25177),\n",
       " (462, 175838),\n",
       " (485, 14643),\n",
       " (491, 142282),\n",
       " (495, 154026),\n",
       " (505, 35640),\n",
       " (508, 75691),\n",
       " (513, 190845),\n",
       " (524, 187112),\n",
       " (526, 36672),\n",
       " (540, 27),\n",
       " (543, 837),\n",
       " (554, 1376),\n",
       " (556, 76098),\n",
       " (562, 26558),\n",
       " (565, 13628),\n",
       " (567, 137663),\n",
       " (568, 139985),\n",
       " (569, 50407),\n",
       " (570, 10299),\n",
       " (571, 27),\n",
       " (572, 37492),\n",
       " (574, 96244),\n",
       " (576, 118778),\n",
       " (577, 55213),\n",
       " (578, 134388),\n",
       " (579, 64465),\n",
       " (585, 15104),\n",
       " (594, 135369),\n",
       " (598, 581),\n",
       " (602, 254),\n",
       " (607, 83056),\n",
       " (609, 39116),\n",
       " (610, 53179),\n",
       " (615, 2661),\n",
       " (622, 11934),\n",
       " (640, 27),\n",
       " (651, 142912),\n",
       " (652, 9529),\n",
       " (654, 198174),\n",
       " (661, 54849),\n",
       " (662, 128713),\n",
       " (668, 128020),\n",
       " (670, 87329),\n",
       " (671, 71721),\n",
       " (675, 628),\n",
       " (677, 3582),\n",
       " (678, 52243),\n",
       " (684, 9353),\n",
       " (686, 32715),\n",
       " (693, 164009),\n",
       " (694, 141607),\n",
       " (696, 160913),\n",
       " (705, 191126),\n",
       " (707, 120242),\n",
       " (715, 124930),\n",
       " (717, 12468),\n",
       " (738, 82899),\n",
       " (743, 22894),\n",
       " (748, 93224),\n",
       " (750, 7874),\n",
       " (755, 43461),\n",
       " (758, 93643),\n",
       " (760, 25215),\n",
       " (761, 130730),\n",
       " (772, 4611),\n",
       " (773, 34416),\n",
       " (776, 27),\n",
       " (777, 83932),\n",
       " (778, 158219),\n",
       " (784, 70937),\n",
       " (787, 9050),\n",
       " (793, 29391),\n",
       " (794, 62600),\n",
       " (801, 39885),\n",
       " (802, 27),\n",
       " (811, 21724),\n",
       " (812, 92272),\n",
       " (814, 10874),\n",
       " (821, 39063),\n",
       " (824, 193466),\n",
       " (825, 122190),\n",
       " (827, 150378),\n",
       " (832, 3702),\n",
       " (840, 100367),\n",
       " (842, 5554),\n",
       " (853, 27),\n",
       " (862, 43897),\n",
       " (872, 91673),\n",
       " (873, 181752),\n",
       " (875, 684),\n",
       " (886, 130109),\n",
       " (889, 69799),\n",
       " (890, 123164),\n",
       " (894, 27),\n",
       " (907, 41405),\n",
       " (920, 27),\n",
       " (945, 178288),\n",
       " (946, 109974),\n",
       " (951, 32904),\n",
       " (953, 65360),\n",
       " (954, 102882),\n",
       " (965, 43647),\n",
       " (968, 116779),\n",
       " (974, 38051),\n",
       " (976, 60302),\n",
       " (977, 81557),\n",
       " (980, 106530),\n",
       " (983, 27),\n",
       " (988, 76716),\n",
       " (995, 32064),\n",
       " (999, 67559),\n",
       " (1001, 22584),\n",
       " (1003, 180407),\n",
       " (1008, 24135),\n",
       " (1009, 34843),\n",
       " (1012, 51910),\n",
       " (1013, 98787),\n",
       " (1017, 83885),\n",
       " (1021, 4813),\n",
       " (1023, 178447),\n",
       " (1031, 91712),\n",
       " (1036, 190191),\n",
       " (1040, 54953),\n",
       " (1043, 23960),\n",
       " (1057, 22602),\n",
       " (1065, 27),\n",
       " (1072, 71624),\n",
       " (1075, 27),\n",
       " (1076, 194372),\n",
       " (1081, 6778),\n",
       " (1082, 4988),\n",
       " (1095, 13747),\n",
       " (1098, 40436),\n",
       " (1105, 56080),\n",
       " (1116, 4020),\n",
       " (1125, 193401),\n",
       " (1128, 109493),\n",
       " (1129, 182300),\n",
       " (1136, 17871),\n",
       " (1142, 116985),\n",
       " (1145, 14349),\n",
       " (1149, 88735),\n",
       " (1155, 8298),\n",
       " (1165, 611),\n",
       " (1168, 72228),\n",
       " (1174, 32312),\n",
       " (1196, 1141),\n",
       " (1206, 196762),\n",
       " (1207, 18330),\n",
       " (1216, 27),\n",
       " (1228, 28639),\n",
       " (1229, 23677),\n",
       " (1236, 27829),\n",
       " (1239, 14075),\n",
       " (1243, 52304),\n",
       " (1245, 98812),\n",
       " (1248, 129973),\n",
       " (1262, 156322),\n",
       " (1266, 95676),\n",
       " (1267, 179384),\n",
       " (1271, 4940),\n",
       " (1282, 41837),\n",
       " (1286, 91767),\n",
       " (1289, 171820),\n",
       " (1300, 151118),\n",
       " (1302, 32218),\n",
       " (1306, 13678),\n",
       " (1314, 51211),\n",
       " (1315, 20324),\n",
       " (1323, 229),\n",
       " (1336, 27774),\n",
       " (1337, 37492),\n",
       " (1349, 62777),\n",
       " (1354, 169337),\n",
       " (1362, 79447),\n",
       " (1364, 837),\n",
       " (1369, 74970),\n",
       " (1371, 23347),\n",
       " (1378, 4398),\n",
       " (1385, 146005),\n",
       " (1388, 165236),\n",
       " (1389, 74165),\n",
       " (1393, 72581),\n",
       " (1400, 189082),\n",
       " (1404, 17863),\n",
       " (1405, 180837),\n",
       " (1418, 8872),\n",
       " (1423, 48811),\n",
       " (1425, 517),\n",
       " (1430, 9425),\n",
       " (1437, 70633),\n",
       " (1443, 8487),\n",
       " (1448, 99103),\n",
       " (1449, 8131),\n",
       " (1455, 193089),\n",
       " (1457, 77625),\n",
       " (1466, 27),\n",
       " (1477, 62306),\n",
       " (1481, 15291),\n",
       " (1482, 10354),\n",
       " (1485, 146512),\n",
       " (1488, 132657),\n",
       " (1494, 46959),\n",
       " (1498, 13161),\n",
       " (1499, 177904),\n",
       " (1509, 77178),\n",
       " (1516, 3296),\n",
       " (1519, 36191),\n",
       " (1526, 7368),\n",
       " (1531, 152673),\n",
       " (1532, 20541),\n",
       " (1533, 27),\n",
       " (1547, 39465),\n",
       " (1550, 27),\n",
       " (1551, 90368),\n",
       " (1552, 12991),\n",
       " (1554, 93046),\n",
       " (1561, 13470),\n",
       " (1562, 42327),\n",
       " (1563, 27218),\n",
       " (1571, 58668),\n",
       " (1577, 19672),\n",
       " (1582, 56454),\n",
       " (1589, 517),\n",
       " (1591, 134376),\n",
       " (1594, 64206),\n",
       " (1596, 150037),\n",
       " (1598, 69024),\n",
       " (1600, 138577),\n",
       " (1608, 15310),\n",
       " (1609, 176718),\n",
       " (1615, 128791),\n",
       " (1621, 13179),\n",
       " (1623, 8033),\n",
       " (1627, 92294),\n",
       " (1632, 6457),\n",
       " (1637, 20197),\n",
       " (1642, 176163),\n",
       " (1646, 17126),\n",
       " (1649, 95262),\n",
       " (1662, 192478),\n",
       " (1665, 3347),\n",
       " (1667, 33386),\n",
       " (1669, 159657),\n",
       " (1679, 27),\n",
       " (1680, 27),\n",
       " (1681, 50213),\n",
       " (1682, 27),\n",
       " (1687, 10091),\n",
       " (1688, 175289),\n",
       " (1703, 43907),\n",
       " (1706, 57693),\n",
       " (1707, 59382),\n",
       " (1722, 105726),\n",
       " (1726, 13353),\n",
       " (1733, 111405),\n",
       " (1739, 51587),\n",
       " (1741, 27),\n",
       " (1748, 9377),\n",
       " (1749, 111646),\n",
       " (1752, 11545),\n",
       " (1755, 112151),\n",
       " (1767, 159967),\n",
       " (1780, 5840),\n",
       " (1782, 12006),\n",
       " (1783, 69545),\n",
       " (1784, 93120),\n",
       " (1788, 837),\n",
       " (1792, 30577),\n",
       " (1794, 603),\n",
       " (1799, 174596),\n",
       " (1800, 83975),\n",
       " (1802, 36975),\n",
       " (1806, 31037),\n",
       " (1808, 16916),\n",
       " (1809, 897),\n",
       " (1814, 82069),\n",
       " (1823, 70546),\n",
       " (1828, 16916),\n",
       " (1832, 115735),\n",
       " (1838, 111984),\n",
       " (1841, 55985),\n",
       " (1856, 91491),\n",
       " (1858, 51499),\n",
       " (1860, 102716),\n",
       " (1866, 837),\n",
       " (1872, 45325),\n",
       " (1873, 140775),\n",
       " (1885, 23653),\n",
       " (1886, 60789),\n",
       " (1887, 12394),\n",
       " (1890, 33753),\n",
       " (1892, 9827),\n",
       " (1899, 66160),\n",
       " (1900, 187404),\n",
       " (1904, 23798),\n",
       " (1907, 96935),\n",
       " (1909, 87262),\n",
       " (1913, 62939),\n",
       " (1917, 154806),\n",
       " (1918, 49675),\n",
       " (1929, 46610),\n",
       " (1930, 70222),\n",
       " (1931, 167917),\n",
       " (1949, 15590),\n",
       " (1954, 12172),\n",
       " (1958, 149552),\n",
       " (1962, 3467),\n",
       " (1965, 182977),\n",
       " (1967, 29354),\n",
       " (1991, 53781),\n",
       " (1996, 27),\n",
       " (2003, 136597),\n",
       " (2004, 4256),\n",
       " (2007, 22497),\n",
       " (2016, 4297),\n",
       " (2019, 26745),\n",
       " (2022, 37914),\n",
       " (2024, 182981),\n",
       " (2027, 128413),\n",
       " (2029, 106079),\n",
       " (2035, 145590),\n",
       " (2036, 27),\n",
       " (2039, 17127),\n",
       " (2041, 88648),\n",
       " (2046, 126629),\n",
       " (2048, 25567),\n",
       " (2056, 31812),\n",
       " (2058, 50451),\n",
       " (2059, 29448),\n",
       " (2062, 150),\n",
       " (2068, 156717),\n",
       " (2072, 108887),\n",
       " (2076, 2003),\n",
       " (2079, 179581),\n",
       " (2084, 105297),\n",
       " (2087, 137253),\n",
       " (2092, 60363),\n",
       " (2094, 3060),\n",
       " (2095, 20541),\n",
       " (2102, 8),\n",
       " (2104, 99859),\n",
       " (2109, 105279),\n",
       " (2113, 51552),\n",
       " (2122, 49471),\n",
       " (2129, 170228),\n",
       " (2131, 27),\n",
       " (2136, 41216),\n",
       " (2145, 134562),\n",
       " (2147, 15291),\n",
       " (2148, 8579),\n",
       " (2153, 90111),\n",
       " (2159, 46755),\n",
       " (2163, 105551),\n",
       " (2164, 5818),\n",
       " (2176, 537),\n",
       " (2178, 36054),\n",
       " (2184, 84454),\n",
       " (2188, 63540),\n",
       " (2191, 107711),\n",
       " (2194, 11113),\n",
       " (2202, 6517),\n",
       " (2203, 9377),\n",
       " (2204, 33890),\n",
       " (2206, 157446),\n",
       " (2212, 1463),\n",
       " (2222, 27),\n",
       " (2227, 28197),\n",
       " (2237, 60315),\n",
       " (2244, 181251),\n",
       " (2245, 139219),\n",
       " (2250, 107244),\n",
       " (2254, 163734),\n",
       " (2260, 154939),\n",
       " (2271, 34866),\n",
       " (2276, 174663),\n",
       " (2277, 4858),\n",
       " (2289, 7138),\n",
       " (2298, 168393),\n",
       " (2301, 27),\n",
       " (2302, 193504),\n",
       " (2309, 192590),\n",
       " (2311, 98766),\n",
       " (2321, 76786),\n",
       " (2322, 132087),\n",
       " (2324, 12468),\n",
       " (2326, 30988),\n",
       " (2336, 44671),\n",
       " (2358, 82968),\n",
       " (2376, 104038),\n",
       " (2378, 12040),\n",
       " (2383, 123045),\n",
       " (2386, 167201),\n",
       " (2390, 55782),\n",
       " (2398, 161203),\n",
       " (2400, 26653),\n",
       " (2402, 21502),\n",
       " (2404, 611),\n",
       " (2406, 19783),\n",
       " (2416, 73507),\n",
       " (2425, 19217),\n",
       " (2426, 149),\n",
       " (2429, 27),\n",
       " (2435, 9087),\n",
       " (2444, 180537),\n",
       " (2445, 167124),\n",
       " (2447, 117260),\n",
       " (2450, 30687),\n",
       " (2463, 13431),\n",
       " (2468, 144531),\n",
       " (2474, 43101),\n",
       " (2479, 665),\n",
       " (2480, 8119),\n",
       " (2481, 32418),\n",
       " (2490, 114762),\n",
       " (2491, 48383),\n",
       " (2497, 10701),\n",
       " (2511, 27),\n",
       " (2516, 1627),\n",
       " (2518, 1613),\n",
       " (2521, 104812),\n",
       " (2531, 57155),\n",
       " (2532, 3756),\n",
       " (2539, 15291),\n",
       " (2544, 82118),\n",
       " (2545, 151847),\n",
       " (2553, 164331),\n",
       " (2560, 4989),\n",
       " (2563, 71817),\n",
       " (2567, 14076),\n",
       " (2569, 35811),\n",
       " (2572, 165222),\n",
       " (2578, 9051),\n",
       " (2580, 68295),\n",
       " (2587, 24468),\n",
       " (2593, 20532),\n",
       " (2594, 115003),\n",
       " (2595, 27109),\n",
       " (2597, 165088),\n",
       " (2602, 192542),\n",
       " (2603, 158012),\n",
       " (2607, 51121),\n",
       " (2608, 2494),\n",
       " (2615, 158357),\n",
       " (2616, 159052),\n",
       " (2618, 32228),\n",
       " (2623, 36566),\n",
       " (2624, 100197),\n",
       " (2626, 8624),\n",
       " (2628, 193982),\n",
       " (2631, 64838),\n",
       " (2637, 171773),\n",
       " (2645, 26264),\n",
       " (2647, 4840),\n",
       " (2674, 17553),\n",
       " (2677, 107528),\n",
       " (2679, 177073),\n",
       " (2681, 161885),\n",
       " (2683, 38022),\n",
       " (2693, 40543),\n",
       " (2695, 62009),\n",
       " (2700, 6562),\n",
       " (2703, 2671),\n",
       " (2706, 100068),\n",
       " (2710, 106515),\n",
       " (2715, 88553),\n",
       " (2724, 26191),\n",
       " (2725, 126285),\n",
       " (2730, 7182),\n",
       " (2734, 1376),\n",
       " (2739, 49380),\n",
       " (2741, 1835),\n",
       " (2749, 1586),\n",
       " (2755, 17463),\n",
       " (2758, 2802),\n",
       " (2763, 32740),\n",
       " (2764, 25732),\n",
       " (2768, 118320),\n",
       " (2771, 16916),\n",
       " (2779, 115697),\n",
       " (2789, 611),\n",
       " (2797, 6066),\n",
       " (2798, 40275),\n",
       " (2803, 67789),\n",
       " (2808, 28013),\n",
       " (2812, 60704),\n",
       " (2819, 77873),\n",
       " (2820, 124713),\n",
       " (2826, 7948),\n",
       " (2828, 27),\n",
       " (2840, 83066),\n",
       " (2845, 4316),\n",
       " (2847, 93671),\n",
       " (2849, 13101),\n",
       " (2854, 3296),\n",
       " (2857, 32218),\n",
       " (2859, 7787),\n",
       " (2871, 164968),\n",
       " (2874, 4883),\n",
       " (2886, 179819),\n",
       " (2887, 128459),\n",
       " (2888, 96345),\n",
       " (2892, 6371),\n",
       " (2894, 67022),\n",
       " (2900, 181994),\n",
       " (2908, 87497),\n",
       " (2910, 116117),\n",
       " (2912, 27),\n",
       " (2913, 24271),\n",
       " (2914, 183843),\n",
       " (2924, 40265),\n",
       " (2930, 11999),\n",
       " (2939, 37787),\n",
       " (2941, 159047),\n",
       " (2945, 48128),\n",
       " (2948, 24679),\n",
       " (2950, 10909),\n",
       " (2953, 104201),\n",
       " (2955, 63644),\n",
       " (2962, 2332),\n",
       " (2968, 3444),\n",
       " (2972, 35916),\n",
       " (2975, 93287),\n",
       " (2980, 50788),\n",
       " (2983, 27),\n",
       " (2985, 7774),\n",
       " (2991, 32562),\n",
       " (2994, 9163),\n",
       " (3005, 3861),\n",
       " (3014, 80959),\n",
       " (3015, 75904),\n",
       " (3018, 4133),\n",
       " (3021, 189308),\n",
       " (3022, 63761),\n",
       " (3025, 72612),\n",
       " (3028, 10312),\n",
       " (3029, 44907),\n",
       " (3033, 185666),\n",
       " (3040, 50077),\n",
       " (3043, 27),\n",
       " (3051, 113371),\n",
       " (3054, 154665),\n",
       " (3057, 40483),\n",
       " (3063, 22191),\n",
       " (3067, 118292),\n",
       " (3069, 64879),\n",
       " (3074, 27),\n",
       " (3078, 131449),\n",
       " (3081, 19765),\n",
       " (3087, 99113),\n",
       " (3092, 136650),\n",
       " (3108, 68817),\n",
       " (3111, 51076),\n",
       " (3115, 8398),\n",
       " (3116, 186023),\n",
       " (3121, 183556),\n",
       " (3123, 27),\n",
       " (3125, 135205),\n",
       " (3131, 6216),\n",
       " (3144, 7610),\n",
       " (3161, 27),\n",
       " (3167, 132572),\n",
       " (3174, 84776),\n",
       " (3184, 3485),\n",
       " (3188, 17630),\n",
       " (3193, 5926),\n",
       " (3198, 174351),\n",
       " (3199, 27),\n",
       " (3201, 189256),\n",
       " (3216, 84826),\n",
       " (3218, 9519),\n",
       " (3220, 52403),\n",
       " (3226, 177947),\n",
       " (3236, 120813),\n",
       " (3246, 85680),\n",
       " (3248, 103447),\n",
       " (3249, 22958),\n",
       " (3253, 31092),\n",
       " (3257, 10494),\n",
       " (3262, 30518),\n",
       " (3264, 27347),\n",
       " (3265, 684),\n",
       " (3273, 105250),\n",
       " (3281, 166924),\n",
       " (3290, 5440),\n",
       " (3298, 130275),\n",
       " (3312, 32463),\n",
       " (3319, 86549),\n",
       " (3328, 6180),\n",
       " (3329, 162245),\n",
       " (3347, 18739),\n",
       " (3348, 103428),\n",
       " (3349, 27),\n",
       " (3351, 20605),\n",
       " (3361, 187008),\n",
       " (3362, 10874),\n",
       " (3371, 51587),\n",
       " (3375, 254),\n",
       " (3376, 27),\n",
       " (3380, 101459),\n",
       " (3402, 94871),\n",
       " (3404, 54474),\n",
       " (3412, 4297),\n",
       " (3414, 183053),\n",
       " (3422, 134198),\n",
       " (3428, 78922),\n",
       " (3445, 39096),\n",
       " (3449, 48811),\n",
       " (3451, 32218),\n",
       " (3453, 95944),\n",
       " (3454, 55173),\n",
       " (3458, 27),\n",
       " (3464, 5627),\n",
       " (3473, 27),\n",
       " (3475, 100505),\n",
       " (3477, 94824),\n",
       " (3486, 137720),\n",
       " (3491, 7829),\n",
       " (3492, 55558),\n",
       " (3499, 142454),\n",
       " (3513, 2494),\n",
       " (3517, 15386),\n",
       " (3518, 91905),\n",
       " (3524, 107628),\n",
       " (3526, 23499),\n",
       " (3528, 185622),\n",
       " (3534, 164087),\n",
       " (3537, 59591),\n",
       " (3541, 163372),\n",
       " (3548, 143599),\n",
       " (3549, 52591),\n",
       " (3551, 10874),\n",
       " (3563, 11091),\n",
       " (3569, 97744),\n",
       " (3573, 153616),\n",
       " (3579, 105044),\n",
       " (3580, 59422),\n",
       " (3581, 57812),\n",
       " (3582, 151135),\n",
       " (3587, 103588),\n",
       " (3589, 192199),\n",
       " (3599, 4792),\n",
       " (3601, 41385),\n",
       " (3602, 27611),\n",
       " (3606, 27),\n",
       " (3610, 27),\n",
       " (3630, 5232),\n",
       " (3638, 113472),\n",
       " (3640, 12099),\n",
       " (3641, 6822),\n",
       " (3648, 16692),\n",
       " (3651, 60005),\n",
       " (3652, 11393),\n",
       " (3655, 124674),\n",
       " (3656, 27),\n",
       " (3657, 22855),\n",
       " (3658, 114911),\n",
       " (3674, 2720),\n",
       " (3676, 5015),\n",
       " (3677, 57898),\n",
       " (3679, 82178),\n",
       " (3683, 16111),\n",
       " (3684, 19902),\n",
       " (3685, 13671),\n",
       " (3689, 197717),\n",
       " (3695, 1618),\n",
       " (3700, 116167),\n",
       " (3702, 9566),\n",
       " (3707, 60385),\n",
       " (3728, 183662),\n",
       " (3731, 182142),\n",
       " (3749, 7596),\n",
       " (3751, 32864),\n",
       " (3752, 137330),\n",
       " (3754, 11786),\n",
       " (3761, 28013),\n",
       " (3764, 3826),\n",
       " (3766, 36993),\n",
       " (3767, 4940),\n",
       " (3776, 56046),\n",
       " (3777, 190998),\n",
       " (3781, 30543),\n",
       " (3782, 19254),\n",
       " (3784, 11646),\n",
       " (3800, 150923),\n",
       " (3806, 41051),\n",
       " (3818, 156308),\n",
       " (3819, 12444),\n",
       " (3821, 150438),\n",
       " (3825, 17570),\n",
       " (3826, 5811),\n",
       " (3828, 117213),\n",
       " (3836, 13747),\n",
       " (3838, 24214),\n",
       " (3839, 72297),\n",
       " (3842, 70217),\n",
       " (3845, 70747),\n",
       " (3852, 197950),\n",
       " (3854, 5843),\n",
       " (3861, 148525),\n",
       " (3862, 138493),\n",
       " (3863, 79542),\n",
       " (3872, 9570),\n",
       " (3883, 90033),\n",
       " (3894, 49311),\n",
       " (3901, 27),\n",
       " (3903, 27),\n",
       " (3910, 158307),\n",
       " (3916, 39020),\n",
       " (3919, 21357),\n",
       " (3920, 21027),\n",
       " (3934, 5939),\n",
       " (3940, 45181),\n",
       " (3941, 88197),\n",
       " (3944, 123026),\n",
       " (3948, 129035),\n",
       " (3950, 75134),\n",
       " (3952, 12991),\n",
       " (3954, 90482),\n",
       " (3962, 61311),\n",
       " (3973, 159267),\n",
       " (3978, 17395),\n",
       " (3993, 150),\n",
       " (3997, 160845),\n",
       " (4006, 39510),\n",
       " (4010, 165225),\n",
       " (4014, 479),\n",
       " (4021, 64830),\n",
       " (4024, 111219),\n",
       " (4026, 124526),\n",
       " (4033, 63547),\n",
       " (4035, 171893),\n",
       " (4037, 183180),\n",
       " (4041, 1923),\n",
       " (4045, 6882),\n",
       " (4059, 4297),\n",
       " (4061, 40504),\n",
       " (4072, 58571),\n",
       " (4073, 96915),\n",
       " (4074, 87348),\n",
       " (4076, 27),\n",
       " (4086, 68491),\n",
       " (4090, 159455),\n",
       " (4091, 27),\n",
       " (4093, 94117),\n",
       " (4095, 11782),\n",
       " (4100, 17871),\n",
       " (4101, 15507),\n",
       " (4105, 4173),\n",
       " (4109, 77746),\n",
       " (4113, 6211),\n",
       " (4115, 80203),\n",
       " (4121, 56483),\n",
       " (4124, 102151),\n",
       " (4126, 12913),\n",
       " (4130, 70342),\n",
       " (4134, 51399),\n",
       " (4135, 27),\n",
       " (4141, 27),\n",
       " (4142, 185630),\n",
       " (4145, 105013),\n",
       " (4146, 4879),\n",
       " (4151, 77314),\n",
       " (4152, 71658),\n",
       " (4155, 9195),\n",
       " (4158, 76870),\n",
       " (4167, 33708),\n",
       " (4169, 19211),\n",
       " (4178, 31072),\n",
       " (4181, 76133),\n",
       " (4182, 17453),\n",
       " (4189, 178),\n",
       " (4193, 139584),\n",
       " (4212, 27),\n",
       " (4235, 93825),\n",
       " (4236, 7138),\n",
       " (4251, 502),\n",
       " (4259, 137140),\n",
       " (4261, 93489),\n",
       " (4266, 3579),\n",
       " (4271, 27255),\n",
       " (4273, 21502),\n",
       " (4279, 82564),\n",
       " (4280, 10364),\n",
       " (4283, 16679),\n",
       " (4289, 70780),\n",
       " (4290, 34988),\n",
       " (4301, 90184),\n",
       " (4303, 4940),\n",
       " (4305, 5281),\n",
       " (4311, 4158),\n",
       " (4317, 14371),\n",
       " (4324, 127464),\n",
       " (4325, 135641),\n",
       " (4327, 93327),\n",
       " (4330, 72573),\n",
       " (4332, 120262),\n",
       " (4342, 113837),\n",
       " (4353, 27),\n",
       " (4357, 141248),\n",
       " (4358, 4991),\n",
       " (4364, 56949),\n",
       " (4384, 100415),\n",
       " (4397, 78006),\n",
       " (4400, 34112),\n",
       " (4407, 79755),\n",
       " (4410, 4110),\n",
       " (4411, 174540),\n",
       " (4412, 23954),\n",
       " (4419, 86748),\n",
       " (4428, 87200),\n",
       " (4438, 56249),\n",
       " (4439, 132024),\n",
       " (4441, 81500),\n",
       " (4444, 99303),\n",
       " (4451, 64380),\n",
       " (4452, 96343),\n",
       " (4455, 124329),\n",
       " (4456, 17902),\n",
       " (4457, 27),\n",
       " (4474, 74291),\n",
       " (4477, 66197),\n",
       " (4478, 4297),\n",
       " (4481, 9425),\n",
       " (4482, 35527),\n",
       " (4497, 135382),\n",
       " (4501, 11963),\n",
       " (4512, 116165),\n",
       " (4514, 47051),\n",
       " (4515, 133263),\n",
       " (4517, 29078),\n",
       " (4518, 229),\n",
       " (4520, 38734),\n",
       " (4527, 177168),\n",
       " (4533, 138597),\n",
       " (4538, 32307),\n",
       " (4545, 27),\n",
       " (4546, 190806),\n",
       " (4547, 66538),\n",
       " (4551, 27),\n",
       " (4557, 77451),\n",
       " (4558, 65965),\n",
       " (4568, 27),\n",
       " (4569, 23560),\n",
       " (4570, 16347),\n",
       " (4574, 58217),\n",
       " (4581, 177361),\n",
       " (4587, 38791),\n",
       " (4591, 40398),\n",
       " (4592, 183064),\n",
       " (4593, 162936),\n",
       " (4597, 84238),\n",
       " (4608, 31210),\n",
       " (4625, 1386),\n",
       " (4626, 4427),\n",
       " (4630, 65740),\n",
       " (4632, 154934),\n",
       " (4637, 28436),\n",
       " (4640, 193761),\n",
       " (4642, 56102),\n",
       " (4644, 160732),\n",
       " (4649, 134614),\n",
       " (4657, 18159),\n",
       " (4666, 58550),\n",
       " (4673, 54450),\n",
       " (4675, 33564),\n",
       " (4679, 181381),\n",
       " (4680, 117652),\n",
       " (4683, 109258),\n",
       " (4686, 5843),\n",
       " (4691, 1682),\n",
       " (4692, 36953),\n",
       " (4698, 133970),\n",
       " (4709, 194918),\n",
       " (4710, 180325),\n",
       " (4714, 185426),\n",
       " (4718, 94063),\n",
       " (4721, 164685),\n",
       " (4722, 42813),\n",
       " (4724, 1681),\n",
       " (4730, 125786),\n",
       " (4733, 40776),\n",
       " (4737, 26211),\n",
       " (4741, 19161),\n",
       " (4743, 73208),\n",
       " (4745, 120944),\n",
       " (4752, 130929),\n",
       " (4759, 126461),\n",
       " (4766, 9142),\n",
       " (4771, 43123),\n",
       " (4772, 12991),\n",
       " (4778, 40413),\n",
       " (4781, 197688),\n",
       " (4801, 180496),\n",
       " (4818, 79395),\n",
       " (4820, 1463),\n",
       " (4827, 62851),\n",
       " (4833, 57592),\n",
       " (4839, 3467),\n",
       " (4871, 36499),\n",
       " (4875, 63322),\n",
       " (4881, 1874),\n",
       " (4892, 166255),\n",
       " (4893, 8),\n",
       " (4897, 153091),\n",
       " (4899, 55447),\n",
       " (4902, 8906),\n",
       " (4904, 131963),\n",
       " (4911, 116154),\n",
       " (4913, 611),\n",
       " (4921, 107603),\n",
       " (4926, 6813),\n",
       " (4927, 41334),\n",
       " (4929, 99730),\n",
       " (4930, 118769),\n",
       " (4932, 4840),\n",
       " ...]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "overlapping_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x144 with 40 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 比较找出的重复图片\n",
    "\n",
    "def img_comparision(dataset1, name1, dataset2, name2, overlappings, num=20):\n",
    "    cmap = \"binary\"\n",
    "    fig, axs = plt.subplots(2, num, figsize=(16, 2))\n",
    "    plt.subplots_adjust(wspace=0.2)\n",
    "    plt.axis('off')\n",
    "\n",
    "    for k in range(20):\n",
    "        i, j = overlappings[k]\n",
    "        train = train_dataset[j]\n",
    "        valid = valid_dataset[i]\n",
    "\n",
    "        axs[0, k].imshow(train, cmap=cmap)\n",
    "        axs[0, k].set_axis_off\n",
    "        axs[0, k].set_title(name1)\n",
    "        axs[0, k].set_xticks([])\n",
    "        axs[0, k].set_yticks([])\n",
    "\n",
    "        axs[1, k].imshow(valid, cmap=cmap)\n",
    "        axs[1, k].set_axis_off\n",
    "        axs[1, k].set_title(name2)\n",
    "        axs[1, k].set_xticks([])\n",
    "        axs[1, k].set_yticks([])\n",
    "\n",
    "img_comparision(train_dataset, 'Train', valid_dataset, 'Valid',\n",
    "                overlapping_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7924"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除验证集中与训练集中重复的图片\n",
    "overlapping_mask = np.array(overlapping_index)[:,0]\n",
    "mask = np.setdiff1d(np.arange(len(valid_dataset)),overlapping_mask)\n",
    "sanitized_valid_dataset = valid_dataset[mask]\n",
    "sanitized_valid_labels = valid_labels[mask]\n",
    "\n",
    "len(sanitized_valid_dataset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0:848;1:879;2:850;3:815;4:811;5:779;6:873;7:711;8:559;9:799;"
     ]
    }
   ],
   "source": [
    "# 去重后图片的类别分布\n",
    "data_distribution(sanitized_valid_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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vW3evDnnnnuu3zao1sK7XC42bNjgV05AWdIqKyvp37+/zowaicXx888/B+Af//gH//znP7Wr25133smUKVP45ptvAF/2WuXmN27cOJo3b67jMLt06UJhYaHOZnfzzTfzwAMP6JiTF154gcWLF+tamLfccotuc02aNGHDhg188sknYWUFn/vt//73P/09MGuk1+vVlqOLLrpIb4u07Zn7XXzxxdoqfeDAAb9zulwu/QzN2GShcWGWbsnPz9eu2IGZjAF+/vOfAz4LYocOHYLuC752VlJSomsknnLKKXGxhpnWmMByBQ6Hg65du2o37jFjxpCXlxcy5tGM3Txw4ACTJk1qSPE1pnV29erVumxPID179vSr+SoWpJqoe2NmvY4F6enpgK8edbSoGMvKysoaVm/z+4MPPqitpLGoKSpuzMJPHVk4CjHh8OHDfnWTzJg4r9fLeeedp/etzZ0vUlR5hnhTV5kjieOMFeYkT8X0QHUSITMuLycnx2+SaD4X27a59957dSxpUlKSrkXYqVMn8vLyIr6uw4cP06pVK8DnPnvjjTfq3+7du5eXX35Zu+PNnTtXu43179+fJUuW6ALOCQkJFBUVkZOTA/iSDj333HOceuqpgG9ROmLECJ34IDs7W7vTfvDBBwwaNEjHT4ajpKREX3tg+Q2FWjiqZAxq32hJTU3luuuuA3wJF1R5nVatWpGdna1Twz///PNRH7s2zEmW2+0OqwgxS9PEO7nJ8YD53pnxjU6nU79jtm3Trl07zjjjDL29X79+euFYW51Hpby5+eab4xIfbU6MnU5njUm2WYd2+vTpHDp0iA8++ED/trb2oa7t/fffB9DtvKEwn8l7771HSUkJUDOh2pgxYwD/xb/gT0MlxLn55psBf6VsJBw9elQrL6BmPWezLuejjz7qFzcuCz9BqB/yBgmCIAiCIAiCIAghEYujEBNUyQSotjia1qzTTz89ZueqzV0r3oWlGxsq7bxCuYdCteuw0rwqbaxCJQhQrpJ33HEHH374ob6nFRUVDB8+HPC5hLZq1Spiy1NpaSkLFy4EYMeOHYwZM0YnNnjssceYMmWKtkg+8MADOnnGP//5T3Jzc7VrVFZWFomJibz99tsATJw4keHDh2u31zlz5tChQwedAGfOnDk6sc7u3bv56KOPtFtruEyw5vbAwu3quk0ren3bXiSW0OnT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\n",
      "text/plain": [
       "<Figure size 1152x144 with 40 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 找出测试集中和训练集中重复的图片\n",
    "\n",
    "overlapping_index1 = find_overlappings(test_dataset, test_labels,\n",
    "                                       train_dataset, train_labels)\n",
    "\n",
    "img_comparision(train_dataset, 'Train', test_dataset, 'Test',\n",
    "                overlapping_index1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**全黑与全空白被判定为相同的图片？？？**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 1min 28s, sys: 2 ms, total: 1min 28s\n",
      "Wall time: 1min 28s\n"
     ]
    }
   ],
   "source": [
    "# 找出测试集中和验证集中重复的图片\n",
    "\n",
    "%%time\n",
    "overlapping_index2 = find_overlappings(test_dataset, test_labels,\n",
    "                                       sanitized_valid_dataset,\n",
    "                                       sanitized_valid_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 删除测试集中与验证集中重复的图片\n",
    "\n",
    "overlapping_mask1 = np.array(overlapping_index1)[:, 0]\n",
    "overlapping_mask2 = np.array(overlapping_index2)[:, 0]\n",
    "mask = np.setdiff1d(np.arange(len(test_dataset)),\n",
    "                    np.union1d(overlapping_mask1, overlapping_mask2))\n",
    "\n",
    "sanitized_test_dataset = test_dataset[mask]\n",
    "sanitized_test_labels = test_labels[mask]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7438\n",
      "0:780;1:850;2:807;3:779;4:759;5:720;6:847;7:635;8:522;9:739;"
     ]
    }
   ],
   "source": [
    "# 去重后的类别分布\n",
    "\n",
    "print(len(sanitized_test_labels))\n",
    "data_distribution(sanitized_test_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 重新保存去重后的数据\n",
    "\n",
    "data_root = '../H/datasets/'\n",
    "pickle_file = os.path.join(data_root, 'sanitized_notMNIST.pickle')\n",
    "\n",
    "try:\n",
    "    f = open(pickle_file, 'wb')\n",
    "    save = {\n",
    "        'valid_train_overlapping_index': overlapping_index,\n",
    "        'test_train_overlapping_index': overlapping_index1,\n",
    "        'test_sani_valid_overlapping_index': overlapping_index2,\n",
    "        'sanitized_test_dataset': sanitized_test_dataset,\n",
    "        'sanitized_test_labels': sanitized_test_labels,\n",
    "        'sanitized_valid_dataset': sanitized_valid_dataset,\n",
    "        'sanitized_valid_labels': sanitized_valid_labels,\n",
    "    }\n",
    "    pickle.dump(save, f, pickle.HIGHEST_PROTOCOL)\n",
    "    f.close()\n",
    "except Exception as e:\n",
    "    print('Unable to save data to', pickle_file, ':', e)\n",
    "    raise"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 逻辑回归多分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_root = '../H/datasets/'\n",
    "pickle_file = os.path.join(data_root, 'sanitized_notMNIST.pickle')\n",
    "with open(pickle_file, 'rb') as f:\n",
    "    data = pickle.load(f)\n",
    "    sanitized_test_dataset = data['sanitized_test_dataset']\n",
    "    sanitized_test_labels = data['sanitized_test_labels']\n",
    "    sanitized_valid_dataset = data['sanitized_valid_dataset']\n",
    "    sanitized_valid_labels = data['sanitized_valid_labels']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将数据一维化\n",
    "\n",
    "train_dataset = train_dataset.reshape((-1,28*28))\n",
    "\n",
    "valid_dataset = valid_dataset.reshape((-1,28*28))\n",
    "test_dataset = test_dataset.reshape((-1,28*28))\n",
    "\n",
    "sanitized_test_dataset = sanitized_test_dataset.reshape((-1,28*28))\n",
    "sanitized_valid_dataset = sanitized_valid_dataset.reshape((-1,28*28))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First 50 samples:A:3;B:4;C:3;D:5;E:6;F:6;G:6;H:6;I:6;J:5;\n",
      "First 100 samples:A:12;B:9;C:9;D:8;E:15;F:7;G:10;H:10;I:10;J:10;\n",
      "First 1000 samples:A:99;B:89;C:87;D:86;E:110;F:100;G:98;H:108;I:112;J:111;\n",
      "First 5000 samples:A:476;B:494;C:524;D:471;E:512;F:519;G:483;H:524;I:501;J:496;\n"
     ]
    }
   ],
   "source": [
    "# 类别分布\n",
    "\n",
    "for num in [50,100,1000,5000]:\n",
    "    print('First {} samples'.format(num),end=':')\n",
    "    data_distribution(train_labels[:num])\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
      "  \"this warning.\", FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
      "  \"this warning.\", FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
      "  \"this warning.\", FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
      "  \"this warning.\", FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 40.7 s, sys: 259 ms, total: 41 s\n",
      "Wall time: 39.1 s\n"
     ]
    }
   ],
   "source": [
    "# 训练模型\n",
    "\n",
    "%%time \n",
    "clfs = []\n",
    "accs = []\n",
    "nums = [50,100,1000,5000]\n",
    "for num in nums:\n",
    "    clf = LogisticRegression()\n",
    "    clf.fit(train_dataset[:num],train_labels[:num])\n",
    "    clfs.append(clf)\n",
    "    \n",
    "    valid_pred = clf.predict(valid_dataset)\n",
    "    acc = accuracy_score(valid_pred, valid_labels)\n",
    "    accs.append(acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.6084, 0.6977, 0.7677, 0.7828]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'accuracy')"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(nums,accs)\n",
    "plt.xlabel('no of samples')\n",
    "plt.ylabel('accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                   multi_class='warn', n_jobs=None, penalty='l2',\n",
       "                   random_state=None, solver='warn', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**训练样本从1000增加到5000，验证精度从 76.8% 增加到 78.3%**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "def confusion_matrix(y_pred, y_true):\n",
    "    cm = np.zeros((10,10))\n",
    "    t = np.arange(len(y_true))\n",
    "    for i in range(10):\n",
    "        for j in range(10):\n",
    "            cm[i,j]=len(t[(y_pred==i)&(y_true==j)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**原始的测试集及验证集**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.78337"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = clfs[3]\n",
    "train_pred = clf.predict(train_dataset)\n",
    "accuracy_score(train_pred, train_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7828"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valid_pred = clf.predict(valid_dataset)\n",
    "accuracy_score(valid_pred, valid_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8576"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_pred = clf.predict(test_dataset)\n",
    "accuracy_score(test_pred, test_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**去重的测试集及验证集**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7651438667339727"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sanitized_valid_pred = clf.predict(sanitized_valid_dataset)\n",
    "accuracy_score(sanitized_valid_pred, sanitized_valid_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8339607421349825"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sanitized_test_pred = clf.predict(sanitized_test_dataset)\n",
    "accuracy_score(sanitized_test_pred, sanitized_test_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**去重后，验证集和测试集的预测精度分别下降 1.5% 和 2.4%**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 逻辑回归超参的影响"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "classifiers = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
      "  \"this warning.\", FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
      "  \"this warning.\", FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
      "  \"this warning.\", FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "/home/student/anaconda3/envs/noam/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
      "  \"this warning.\", FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 15min 26s, sys: 1.85 s, total: 15min 28s\n",
      "Wall time: 15min 28s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "penalty = ['l1', 'l2']\n",
    "C = [1, 10]\n",
    "\n",
    "for p, c in product(penalty, C):\n",
    "    clf = LogisticRegression(penalty=p, C=c)\n",
    "    clf.fit(train_dataset[:10000], train_labels[:10000])\n",
    "    classifiers.append(clf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n",
       "                    intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                    multi_class='warn', n_jobs=None, penalty='l1',\n",
       "                    random_state=None, solver='warn', tol=0.0001, verbose=0,\n",
       "                    warm_start=False),\n",
       " LogisticRegression(C=10, class_weight=None, dual=False, fit_intercept=True,\n",
       "                    intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                    multi_class='warn', n_jobs=None, penalty='l1',\n",
       "                    random_state=None, solver='warn', tol=0.0001, verbose=0,\n",
       "                    warm_start=False),\n",
       " LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n",
       "                    intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                    multi_class='warn', n_jobs=None, penalty='l2',\n",
       "                    random_state=None, solver='warn', tol=0.0001, verbose=0,\n",
       "                    warm_start=False),\n",
       " LogisticRegression(C=10, class_weight=None, dual=False, fit_intercept=True,\n",
       "                    intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                    multi_class='warn', n_jobs=None, penalty='l2',\n",
       "                    random_state=None, solver='warn', tol=0.0001, verbose=0,\n",
       "                    warm_start=False)]"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "classifiers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "accs = []\n",
    "for clf in classifiers:\n",
    "    sanitized_valid_pred = clf.predict(sanitized_valid_dataset)\n",
    "    acc = accuracy_score(sanitized_valid_pred, sanitized_valid_labels)\n",
    "    accs.append(acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.7695608278647148,\n",
       " 0.7248864209994952,\n",
       " 0.7651438667339727,\n",
       " 0.7318273599192328]"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                   multi_class='warn', n_jobs=None, penalty='l1',\n",
       "                   random_state=None, solver='warn', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "best_clf = classifiers[0]\n",
    "best_clf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8439096531325625"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sanitized_test_pred = best_clf.predict(sanitized_test_dataset)\n",
    "accuracy_score(sanitized_test_pred, sanitized_test_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 基于TensorFlow的逻辑回归多分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from six.moves import cPickle as pickle\n",
    "from six.moves import range"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set (200000, 28, 28) (200000,)\n",
      "Validation set (10000, 28, 28) (10000,)\n",
      "Test set (10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "pickle_file = '../H/datasets/notMNIST.pickle'\n",
    "\n",
    "with open(pickle_file, 'rb') as f:\n",
    "    save = pickle.load(f)\n",
    "    train_dataset = save['train_dataset']\n",
    "    train_labels = save['train_labels']\n",
    "    valid_dataset = save['valid_dataset']\n",
    "    valid_labels = save['valid_labels']\n",
    "    test_dataset = save['test_dataset']\n",
    "    test_labels = save['test_labels']\n",
    "    del save  # hint to help gc free up memory\n",
    "    print('Training set', train_dataset.shape, train_labels.shape)\n",
    "    print('Validation set', valid_dataset.shape, valid_labels.shape)\n",
    "    print('Test set', test_dataset.shape, test_labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "去重的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sanitized_Validation set (7924, 28, 28) (7924,)\n",
      "sanitized_Test set (7438, 28, 28) (7438,)\n"
     ]
    }
   ],
   "source": [
    "pickle_file = '../H/datasets/sanitized_notMNIST.pickle'\n",
    "\n",
    "with open(pickle_file, 'rb') as f:\n",
    "    save = pickle.load(f)\n",
    "    sanitized_valid_dataset = save['sanitized_valid_dataset']\n",
    "    sanitized_valid_labels = save['sanitized_valid_labels']\n",
    "    sanitized_test_dataset = save['sanitized_test_dataset']\n",
    "    sanitized_test_labels = save['sanitized_test_labels']\n",
    "    del save  # hint to help gc free up memory|\n",
    "    print('sanitized_Validation set', sanitized_valid_dataset.shape,\n",
    "          sanitized_valid_labels.shape)\n",
    "    print('sanitized_Test set', sanitized_test_dataset.shape,\n",
    "          sanitized_test_labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据处理\n",
    "- 将图片的28x28数据，转化为一维向量\n",
    "- 将每个标签转化为one-hoet向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set (200000, 784) (200000, 10)\n",
      "Validation set (10000, 784) (10000, 10)\n",
      "Test set (10000, 784) (10000, 10)\n"
     ]
    }
   ],
   "source": [
    "image_size = 28\n",
    "num_labels = 10\n",
    "\n",
    "\n",
    "def reformat(dataset, labels):\n",
    "    dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)\n",
    "    # Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...]\n",
    "    labels = (np.arange(num_labels) == labels[:, None]).astype(np.float32)\n",
    "    return dataset, labels\n",
    "\n",
    "\n",
    "train_dataset, train_labels = reformat(train_dataset, train_labels)\n",
    "valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\n",
    "test_dataset, test_labels = reformat(test_dataset, test_labels)\n",
    "print('Training set', train_dataset.shape, train_labels.shape)\n",
    "print('Validation set', valid_dataset.shape, valid_labels.shape)\n",
    "print('Test set', test_dataset.shape, test_labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sanitized_Validation set (7924, 784) (7924, 10)\n",
      "sanitized_Test set (7438, 784) (7438, 10)\n"
     ]
    }
   ],
   "source": [
    "sanitized_valid_dataset, sanitized_valid_labels = reformat(\n",
    "    sanitized_valid_dataset, sanitized_valid_labels)\n",
    "sanitized_test_dataset, sanitized_test_labels = reformat(\n",
    "    sanitized_test_dataset, sanitized_test_labels)\n",
    "print('sanitized_Validation set', sanitized_valid_dataset.shape,\n",
    "      sanitized_valid_labels.shape)\n",
    "print('sanitized_Test set', sanitized_test_dataset.shape,\n",
    "      sanitized_test_labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多分类逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [],
   "source": [
    "# With gradient descent training, even this much data is prohibitive.\n",
    "# Subset the training data for faster turnaround.\n",
    "train_subset = 10000\n",
    "\n",
    "graph = tf.Graph()\n",
    "with graph.as_default():\n",
    "\n",
    "    # Input data.\n",
    "    # Load the training, validation and test data into constants that are\n",
    "    # attached to the graph.\n",
    "    tf_train_dataset = tf.constant(train_dataset[:train_subset, :])\n",
    "    tf_train_labels = tf.constant(train_labels[:train_subset])\n",
    "    tf_valid_dataset = tf.constant(valid_dataset)\n",
    "    tf_test_dataset = tf.constant(test_dataset)\n",
    "\n",
    "    # Variables.\n",
    "    # These are the parameters that we are going to be training. The weight\n",
    "    # matrix will be initialized using random values following a (truncated)\n",
    "    # normal distribution. The biases get initialized to zero.\n",
    "    weights = tf.Variable(\n",
    "        tf.truncated_normal([image_size * image_size, num_labels]))\n",
    "    biases = tf.Variable(tf.zeros([num_labels]))\n",
    "\n",
    "    # Training computation.\n",
    "    # We multiply the inputs with the weight matrix, and add biases. We compute\n",
    "    # the softmax and cross-entropy (it's one operation in TensorFlow, because\n",
    "    # it's very common, and it can be optimized). We take the average of this\n",
    "    # cross-entropy across all training examples: that's our loss.\n",
    "    logits = tf.matmul(tf_train_dataset, weights) + biases\n",
    "    loss = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits(labels=tf_train_labels,\n",
    "                                                logits=logits))\n",
    "\n",
    "    # Optimizer.\n",
    "    # We are going to find the minimum of this loss using gradient descent.\n",
    "    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n",
    "\n",
    "    # Predictions for the training, validation, and test data.\n",
    "    # These are not part of training, but merely here so that we can report\n",
    "    # accuracy figures as we train.\n",
    "    train_prediction = tf.nn.softmax(logits)\n",
    "    valid_prediction = tf.nn.softmax(\n",
    "        tf.matmul(tf_valid_dataset, weights) + biases)\n",
    "    test_prediction = tf.nn.softmax(\n",
    "        tf.matmul(tf_test_dataset, weights) + biases)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [],
   "source": [
    "def accuracy(predictions, labels):\n",
    "    return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1)) /\n",
    "            predictions.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "Loss at step 0: 21.951445\n",
      "Training accuracy: 7.6%\n",
      "Validation accuracy: 12.1%\n",
      "Loss at step 100: 2.229361\n",
      "Training accuracy: 72.8%\n",
      "Validation accuracy: 71.6%\n",
      "Loss at step 200: 1.789998\n",
      "Training accuracy: 75.5%\n",
      "Validation accuracy: 74.1%\n",
      "Loss at step 300: 1.558776\n",
      "Training accuracy: 76.9%\n",
      "Validation accuracy: 74.6%\n",
      "Loss at step 400: 1.404579\n",
      "Training accuracy: 77.8%\n",
      "Validation accuracy: 74.9%\n",
      "Loss at step 500: 1.290256\n",
      "Training accuracy: 78.6%\n",
      "Validation accuracy: 75.3%\n",
      "Loss at step 600: 1.200214\n",
      "Training accuracy: 79.2%\n",
      "Validation accuracy: 75.6%\n",
      "Loss at step 700: 1.126540\n",
      "Training accuracy: 79.6%\n",
      "Validation accuracy: 75.8%\n",
      "Loss at step 800: 1.064710\n",
      "Training accuracy: 79.9%\n",
      "Validation accuracy: 76.0%\n",
      "Test accuracy: 83.1%\n"
     ]
    }
   ],
   "source": [
    "num_steps = 801\n",
    "\n",
    "with tf.Session(graph=graph) as session:\n",
    "    # This is a one-time operation which ensures the parameters get initialized as\n",
    "    # we described in the graph: random weights for the matrix, zeros for the\n",
    "    # biases.\n",
    "    tf.global_variables_initializer().run()\n",
    "    print('Initialized')\n",
    "    for step in range(num_steps):\n",
    "        # Run the computations. We tell .run() that we want to run the optimizer,\n",
    "        # and get the loss value and the training predictions returned as numpy\n",
    "        # arrays.\n",
    "        _, l, predictions = session.run([optimizer, loss, train_prediction])\n",
    "        if (step % 100 == 0):\n",
    "            print('Loss at step %d: %f' % (step, l))\n",
    "            print('Training accuracy: %.1f%%' %\n",
    "                  accuracy(predictions, train_labels[:train_subset, :]))\n",
    "            # Calling .eval() on valid_prediction is basically like calling run(), but\n",
    "            # just to get that one numpy array. Note that it recomputes all its graph\n",
    "            # dependencies.\n",
    "            print('Validation accuracy: %.1f%%' %\n",
    "                  accuracy(valid_prediction.eval(), valid_labels))\n",
    "    print('Test accuracy: %.1f%%' %\n",
    "          accuracy(test_prediction.eval(), test_labels))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 随机梯度下降训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 128\n",
    "\n",
    "graph = tf.Graph()\n",
    "with graph.as_default():\n",
    "\n",
    "    # Input data. For the training data, we use a placeholder that will be fed\n",
    "    # at run time with a training minibatch.\n",
    "    tf_train_dataset = tf.placeholder(tf.float32,\n",
    "                                      shape=(batch_size,\n",
    "                                             image_size * image_size))\n",
    "    tf_train_labels = tf.placeholder(tf.float32,\n",
    "                                     shape=(batch_size, num_labels))\n",
    "    tf_valid_dataset = tf.constant(valid_dataset)\n",
    "    tf_test_dataset = tf.constant(test_dataset)\n",
    "\n",
    "    # Variables.\n",
    "    weights = tf.Variable(\n",
    "        tf.truncated_normal([image_size * image_size, num_labels]))\n",
    "    biases = tf.Variable(tf.zeros([num_labels]))\n",
    "\n",
    "    # Training computation.\n",
    "    logits = tf.matmul(tf_train_dataset, weights) + biases\n",
    "    loss = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits(labels=tf_train_labels,\n",
    "                                                logits=logits))\n",
    "\n",
    "    # Optimizer.\n",
    "    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n",
    "\n",
    "    # Predictions for the training, validation, and test data.\n",
    "    train_prediction = tf.nn.softmax(logits)\n",
    "    valid_prediction = tf.nn.softmax(\n",
    "        tf.matmul(tf_valid_dataset, weights) + biases)\n",
    "    test_prediction = tf.nn.softmax(\n",
    "        tf.matmul(tf_test_dataset, weights) + biases)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "Minibatch loss at step 0: 20.930994\n",
      "Minibatch accuracy: 6.2%\n",
      "Validation accuracy: 8.8%\n",
      "Minibatch loss at step 500: 1.645523\n",
      "Minibatch accuracy: 78.1%\n",
      "Validation accuracy: 76.7%\n",
      "Minibatch loss at step 1000: 1.300367\n",
      "Minibatch accuracy: 79.7%\n",
      "Validation accuracy: 77.3%\n",
      "Minibatch loss at step 1500: 1.049319\n",
      "Minibatch accuracy: 80.5%\n",
      "Validation accuracy: 78.0%\n",
      "Minibatch loss at step 2000: 1.111283\n",
      "Minibatch accuracy: 82.8%\n",
      "Validation accuracy: 78.9%\n",
      "Minibatch loss at step 2500: 0.775358\n",
      "Minibatch accuracy: 79.7%\n",
      "Validation accuracy: 79.5%\n",
      "Minibatch loss at step 3000: 0.956375\n",
      "Minibatch accuracy: 78.1%\n",
      "Validation accuracy: 78.8%\n",
      "Test accuracy: 85.4%\n"
     ]
    }
   ],
   "source": [
    "num_steps = 3001\n",
    "\n",
    "with tf.Session(graph=graph) as session:\n",
    "    tf.global_variables_initializer().run()\n",
    "    print(\"Initialized\")\n",
    "    for step in range(num_steps):\n",
    "        # Pick an offset within the training data, which has been randomized.\n",
    "        # Note: we could use better randomization across epochs.\n",
    "        offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n",
    "        # Generate a minibatch.\n",
    "        batch_data = train_dataset[offset:(offset + batch_size), :]\n",
    "        batch_labels = train_labels[offset:(offset + batch_size), :]\n",
    "        # Prepare a dictionary telling the session where to feed the minibatch.\n",
    "        # The key of the dictionary is the placeholder node of the graph to be fed,\n",
    "        # and the value is the numpy array to feed to it.\n",
    "        feed_dict = {\n",
    "            tf_train_dataset: batch_data,\n",
    "            tf_train_labels: batch_labels\n",
    "        }\n",
    "        _, l, predictions = session.run([optimizer, loss, train_prediction],\n",
    "                                        feed_dict=feed_dict)\n",
    "        if (step % 500 == 0):\n",
    "            print(\"Minibatch loss at step %d: %f\" % (step, l))\n",
    "            print(\"Minibatch accuracy: %.1f%%\" %\n",
    "                  accuracy(predictions, batch_labels))\n",
    "            print(\"Validation accuracy: %.1f%%\" %\n",
    "                  accuracy(valid_prediction.eval(), valid_labels))\n",
    "    print(\"Test accuracy: %.1f%%\" %\n",
    "          accuracy(test_prediction.eval(), test_labels))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 神经网络分类器\n",
    "创建2层神经网络模型，1024隐藏神经元，relu 激活函数，"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 128\n",
    "hidden_layer_size = 1024\n",
    "num_labels = 10\n",
    "graph = tf.Graph()\n",
    "\n",
    "with graph.as_default():\n",
    "    x = tf.placeholder(tf.float32, shape=(None, image_size * image_size))\n",
    "    y_ = tf.placeholder(tf.float32, shape=(None, num_labels))\n",
    "\n",
    "    w1 = tf.Variable(\n",
    "        tf.truncated_normal([image_size * image_size, hidden_layer_size]))\n",
    "    b1 = tf.Variable(tf.zeros([hidden_layer_size]))\n",
    "    y1 = tf.matmul(x, w1) + b1\n",
    "    y1_relu = tf.nn.relu(y1)\n",
    "\n",
    "    w2 = tf.Variable(tf.truncated_normal([hidden_layer_size, num_labels]))\n",
    "    b2 = tf.Variable(tf.zeros([num_labels]))\n",
    "    y_pred = tf.matmul(y1_relu, w2) + b2\n",
    "\n",
    "    cross_entropy = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_pred))\n",
    "\n",
    "    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)\n",
    "\n",
    "    correct_predicetion = tf.equal(tf.argmax(y_, 1), tf.argmax(y_pred, 1))\n",
    "    accuracy = tf.reduce_mean(tf.cast(correct_predicetion, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "step 0:\n",
      "Minibatch loss: 960.6638793945312, accuracy: 0.5546875\n",
      "Validation accuracy: 0.37630000710487366\n",
      "--------------------------------------------------------------------------------\n",
      "step 500:\n",
      "Minibatch loss: 15.633955001831055, accuracy: 0.8984375\n",
      "Validation accuracy: 0.7930999994277954\n",
      "--------------------------------------------------------------------------------\n",
      "step 1000:\n",
      "Minibatch loss: 2.486438512802124, accuracy: 0.9140625\n",
      "Validation accuracy: 0.8104000091552734\n",
      "--------------------------------------------------------------------------------\n",
      "step 1500:\n",
      "Minibatch loss: 1.3642990589141846, accuracy: 0.9140625\n",
      "Validation accuracy: 0.8201000094413757\n",
      "--------------------------------------------------------------------------------\n",
      "step 2000:\n",
      "Minibatch loss: 1.4904862642288208, accuracy: 0.9140625\n",
      "Validation accuracy: 0.8079000115394592\n",
      "--------------------------------------------------------------------------------\n",
      "step 2500:\n",
      "Minibatch loss: 2.2373385429382324, accuracy: 0.9140625\n",
      "Validation accuracy: 0.829800009727478\n",
      "--------------------------------------------------------------------------------\n",
      "step 3000:\n",
      "Minibatch loss: 0.4583434462547302, accuracy: 0.9453125\n",
      "Validation accuracy: 0.8248000144958496\n",
      "--------------------------------------------------------------------------------\n",
      "Test accuracy: 0.8916000127792358\n",
      "sanitized_Test accuracy: 0.8635385632514954\n"
     ]
    }
   ],
   "source": [
    "num_steps = 3001\n",
    "\n",
    "with tf.Session(graph=graph) as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    print(\"Initialized\")\n",
    "    for step in range(num_steps):\n",
    "        offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n",
    "\n",
    "        batch_data = train_dataset[offset:(offset + batch_size), :]\n",
    "        batch_labels = train_labels[offset:(offset + batch_size), :]\n",
    "\n",
    "        sess.run(train_step, feed_dict={x: batch_data, y_: batch_labels})\n",
    "\n",
    "        if (step % 500 == 0):\n",
    "            loss, train_acc = sess.run([cross_entropy, accuracy],\n",
    "                                       feed_dict={\n",
    "                                           x: batch_data,\n",
    "                                           y_: batch_labels\n",
    "                                       })\n",
    "            print(\"step {}:\".format(step))\n",
    "            print(\"Minibatch loss: {}, accuracy: {}\".format(loss, train_acc))\n",
    "            val_acc = sess.run(accuracy,\n",
    "                               feed_dict={\n",
    "                                   x: valid_dataset,\n",
    "                                   y_: valid_labels\n",
    "                               })\n",
    "            print(\"Validation accuracy: {}\".format(val_acc))\n",
    "            print('-' * 80)\n",
    "\n",
    "    test_acc = sess.run(accuracy, feed_dict={x: test_dataset, y_: test_labels})\n",
    "    print(\"Test accuracy: {}\".format(test_acc))\n",
    "\n",
    "    sanitized_test_acc = sess.run(accuracy,\n",
    "                                  feed_dict={\n",
    "                                      x: sanitized_test_dataset,\n",
    "                                      y_: sanitized_test_labels\n",
    "                                  })\n",
    "    print(\"sanitized_Test accuracy: {}\".format(sanitized_test_acc))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 提升模型性能"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## l2正则化的逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 128\n",
    "\n",
    "graph = tf.Graph()\n",
    "with graph.as_default():\n",
    "\n",
    "    tf_train_dataset = tf.placeholder(tf.float32,\n",
    "                                      shape=(batch_size,\n",
    "                                             image_size * image_size))\n",
    "    tf_train_labels = tf.placeholder(tf.float32,\n",
    "                                     shape=(batch_size, num_labels))\n",
    "    tf_valid_dataset = tf.constant(valid_dataset)\n",
    "    tf_test_dataset = tf.constant(test_dataset)\n",
    "\n",
    "    # Variables.\n",
    "    weights = tf.Variable(\n",
    "        tf.truncated_normal([image_size * image_size, num_labels]))\n",
    "    biases = tf.Variable(tf.zeros([num_labels]))\n",
    "\n",
    "    # Training computation.\n",
    "    logits = tf.matmul(tf_train_dataset, weights) + biases\n",
    "    loss = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits(labels=tf_train_labels,\n",
    "                                                logits=logits))\n",
    "\n",
    "    # 加入 l2 正则化\n",
    "    l2_param = 0.001\n",
    "    loss += l2_param * tf.nn.l2_loss(weights)\n",
    "\n",
    "    # Optimizer.\n",
    "    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n",
    "\n",
    "    # Predictions for the training, validation, and test data.\n",
    "    train_prediction = tf.nn.softmax(logits)\n",
    "    valid_prediction = tf.nn.softmax(\n",
    "        tf.matmul(tf_valid_dataset, weights) + biases)\n",
    "    test_prediction = tf.nn.softmax(\n",
    "        tf.matmul(tf_test_dataset, weights) + biases)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "Minibatch loss at step 0: 20.827627\n",
      "Minibatch accuracy: 10.2%\n",
      "Validation accuracy: 15.2%\n",
      "Minibatch loss at step 500: 2.655389\n",
      "Minibatch accuracy: 78.9%\n",
      "Validation accuracy: 76.6%\n",
      "Minibatch loss at step 1000: 1.799305\n",
      "Minibatch accuracy: 82.0%\n",
      "Validation accuracy: 79.2%\n",
      "Minibatch loss at step 1500: 1.163723\n",
      "Minibatch accuracy: 82.8%\n",
      "Validation accuracy: 80.1%\n",
      "Minibatch loss at step 2000: 0.965932\n",
      "Minibatch accuracy: 82.8%\n",
      "Validation accuracy: 81.2%\n",
      "Minibatch loss at step 2500: 0.746682\n",
      "Minibatch accuracy: 85.9%\n",
      "Validation accuracy: 82.0%\n",
      "Minibatch loss at step 3000: 0.848776\n",
      "Minibatch accuracy: 78.9%\n",
      "Validation accuracy: 82.0%\n",
      "Test accuracy: 88.6%\n"
     ]
    }
   ],
   "source": [
    "num_steps = 3001\n",
    "\n",
    "with tf.Session(graph=graph) as session:\n",
    "    tf.global_variables_initializer().run()\n",
    "    print(\"Initialized\")\n",
    "    for step in range(num_steps):\n",
    "        # Pick an offset within the training data, which has been randomized.\n",
    "        # Note: we could use better randomization across epochs.\n",
    "        offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n",
    "        # Generate a minibatch.\n",
    "        batch_data = train_dataset[offset:(offset + batch_size), :]\n",
    "        batch_labels = train_labels[offset:(offset + batch_size), :]\n",
    "        # Prepare a dictionary telling the session where to feed the minibatch.\n",
    "        # The key of the dictionary is the placeholder node of the graph to be fed,\n",
    "        # and the value is the numpy array to feed to it.\n",
    "        feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}\n",
    "        _, l, predictions = session.run([optimizer, loss, train_prediction], feed_dict=feed_dict)\n",
    "        if (step % 500 == 0):\n",
    "            print(\"Minibatch loss at step %d: %f\" % (step, l))\n",
    "            print(\"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels))\n",
    "            print(\"Validation accuracy: %.1f%%\" % accuracy(valid_prediction.eval(), valid_labels))\n",
    "    print(\"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**加入l2正则化，逻辑回归精度从 85.4% 提升到 88.6%**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## l2正则化的神经网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 128\n",
    "hidden_layer_size = 1024\n",
    "num_labels = 10\n",
    "graph = tf.Graph()\n",
    "\n",
    "with graph.as_default():\n",
    "    x = tf.placeholder(tf.float32, shape=(None, image_size * image_size))\n",
    "    y_ = tf.placeholder(tf.float32, shape=(None, num_labels))\n",
    "\n",
    "    w1 = tf.Variable(\n",
    "        tf.truncated_normal([image_size * image_size, hidden_layer_size]))\n",
    "    b1 = tf.Variable(tf.zeros([hidden_layer_size]))\n",
    "    y1 = tf.matmul(x, w1) + b1\n",
    "    y1_relu = tf.nn.relu(y1)\n",
    "\n",
    "    w2 = tf.Variable(tf.truncated_normal([hidden_layer_size, num_labels]))\n",
    "    b2 = tf.Variable(tf.zeros([num_labels]))\n",
    "    y_pred = tf.matmul(y1_relu, w2) + b2\n",
    "\n",
    "    cross_entropy = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_pred))\n",
    "\n",
    "    l2_param = 0.001\n",
    "    cross_entropy += l2_param * (tf.nn.l2_loss(w1) + tf.nn.l2_loss(w2))\n",
    "\n",
    "    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)\n",
    "\n",
    "    correct_predicetion = tf.equal(tf.argmax(y_, 1), tf.argmax(y_pred, 1))\n",
    "    accuracy = tf.reduce_mean(tf.cast(correct_predicetion, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "step 0:\n",
      "Minibatch loss: 1366.8778076171875, accuracy: 0.53125\n",
      "Validation accuracy: 0.4366999864578247\n",
      "--------------------------------------------------------------------------------\n",
      "step 500:\n",
      "Minibatch loss: 197.82177734375, accuracy: 0.8671875\n",
      "Validation accuracy: 0.7842000126838684\n",
      "--------------------------------------------------------------------------------\n",
      "step 1000:\n",
      "Minibatch loss: 113.80962371826172, accuracy: 0.90625\n",
      "Validation accuracy: 0.8123999834060669\n",
      "--------------------------------------------------------------------------------\n",
      "step 1500:\n",
      "Minibatch loss: 67.86046600341797, accuracy: 0.9140625\n",
      "Validation accuracy: 0.8345000147819519\n",
      "--------------------------------------------------------------------------------\n",
      "step 2000:\n",
      "Minibatch loss: 41.037872314453125, accuracy: 0.953125\n",
      "Validation accuracy: 0.8529000282287598\n",
      "--------------------------------------------------------------------------------\n",
      "step 2500:\n",
      "Minibatch loss: 25.001123428344727, accuracy: 0.9140625\n",
      "Validation accuracy: 0.8712999820709229\n",
      "--------------------------------------------------------------------------------\n",
      "step 3000:\n",
      "Minibatch loss: 15.305781364440918, accuracy: 0.921875\n",
      "Validation accuracy: 0.8738999962806702\n",
      "--------------------------------------------------------------------------------\n",
      "Test accuracy: 0.9308000206947327\n",
      "sanitized_Test accuracy: 0.9119386672973633\n"
     ]
    }
   ],
   "source": [
    "num_steps = 3001\n",
    "\n",
    "with tf.Session(graph=graph) as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    print(\"Initialized\")\n",
    "    for step in range(num_steps):\n",
    "        offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n",
    "\n",
    "        batch_data = train_dataset[offset:(offset + batch_size), :]\n",
    "        batch_labels = train_labels[offset:(offset + batch_size), :]\n",
    "\n",
    "        sess.run(train_step,feed_dict={x: batch_data, y_ :batch_labels})\n",
    "        \n",
    "        if (step % 500 == 0):\n",
    "            loss, train_acc = sess.run([cross_entropy,accuracy],\n",
    "                                       feed_dict={x: batch_data, y_ :batch_labels})\n",
    "            print(\"step {}:\".format(step))\n",
    "            print(\"Minibatch loss: {}, accuracy: {}\".format(loss,train_acc))\n",
    "            val_acc = sess.run(accuracy,feed_dict={x: valid_dataset,\n",
    "                                                   y_: valid_labels})\n",
    "            print(\"Validation accuracy: {}\".format(val_acc))\n",
    "            print('-'*80)\n",
    "\n",
    "\n",
    "    test_acc = sess.run(accuracy,feed_dict={x: test_dataset, \n",
    "                                            y_: test_labels})\n",
    "    print(\"Test accuracy: {}\".format(test_acc))\n",
    "    \n",
    "    sanitized_test_acc = sess.run(accuracy,feed_dict={x: sanitized_test_dataset, \n",
    "                                            y_: sanitized_test_labels})\n",
    "    print(\"sanitized_Test accuracy: {}\".format(sanitized_test_acc))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**加入l2正则化，神经网络精度从 86.4% 提升到 91.2%**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 过拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "step 0:\n",
      "Minibatch loss: 956.3731689453125, accuracy: 0.4375\n",
      "Validation accuracy: 0.3133000135421753\n",
      "--------------------------------------------------------------------------------\n",
      "step 500:\n",
      "Minibatch loss: 190.64984130859375, accuracy: 1.0\n",
      "Validation accuracy: 0.6866999864578247\n",
      "--------------------------------------------------------------------------------\n",
      "step 1000:\n",
      "Minibatch loss: 115.62052154541016, accuracy: 1.0\n",
      "Validation accuracy: 0.6858999729156494\n",
      "--------------------------------------------------------------------------------\n",
      "step 1500:\n",
      "Minibatch loss: 70.1186294555664, accuracy: 1.0\n",
      "Validation accuracy: 0.6861000061035156\n",
      "--------------------------------------------------------------------------------\n",
      "step 2000:\n",
      "Minibatch loss: 42.52379608154297, accuracy: 1.0\n",
      "Validation accuracy: 0.6869000196456909\n",
      "--------------------------------------------------------------------------------\n",
      "step 2500:\n",
      "Minibatch loss: 25.788822174072266, accuracy: 1.0\n",
      "Validation accuracy: 0.6887000203132629\n",
      "--------------------------------------------------------------------------------\n",
      "step 3000:\n",
      "Minibatch loss: 15.63992977142334, accuracy: 1.0\n",
      "Validation accuracy: 0.6926000118255615\n",
      "--------------------------------------------------------------------------------\n",
      "Test accuracy: 0.7700999975204468\n",
      "sanitized_Test accuracy: 0.7311105132102966\n"
     ]
    }
   ],
   "source": [
    "num_steps = 3001\n",
    "\n",
    "with tf.Session(graph=graph) as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    print(\"Initialized\")\n",
    "    for step in range(num_steps):\n",
    "\n",
    "        # 限制训练样本的数量，1000\n",
    "        offset = (step * batch_size) % (200 - batch_size)\n",
    "\n",
    "        batch_data = train_dataset[offset:(offset + batch_size), :]\n",
    "        batch_labels = train_labels[offset:(offset + batch_size), :]\n",
    "\n",
    "        sess.run(train_step, feed_dict={x: batch_data, y_: batch_labels})\n",
    "\n",
    "        if (step % 500 == 0):\n",
    "            loss, train_acc = sess.run([cross_entropy, accuracy],\n",
    "                                       feed_dict={\n",
    "                                           x: batch_data,\n",
    "                                           y_: batch_labels\n",
    "                                       })\n",
    "            print(\"step {}:\".format(step))\n",
    "            print(\"Minibatch loss: {}, accuracy: {}\".format(loss, train_acc))\n",
    "            val_acc = sess.run(accuracy,\n",
    "                               feed_dict={\n",
    "                                   x: valid_dataset,\n",
    "                                   y_: valid_labels\n",
    "                               })\n",
    "            print(\"Validation accuracy: {}\".format(val_acc))\n",
    "            print('-' * 80)\n",
    "\n",
    "    test_acc = sess.run(accuracy, feed_dict={x: test_dataset, y_: test_labels})\n",
    "    print(\"Test accuracy: {}\".format(test_acc))\n",
    "\n",
    "    sanitized_test_acc = sess.run(accuracy,\n",
    "                                  feed_dict={\n",
    "                                      x: sanitized_test_dataset,\n",
    "                                      y_: sanitized_test_labels\n",
    "                                  })\n",
    "    print(\"sanitized_Test accuracy: {}\".format(sanitized_test_acc))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**限制训练样本的数量1000，训练精度很快达到1.0，但是最终模型测试精度较低 0.73**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dropout"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 128\n",
    "hidden_layer_size = 1024\n",
    "num_labels = 10\n",
    "graph = tf.Graph()\n",
    "\n",
    "with graph.as_default():\n",
    "    x = tf.placeholder(tf.float32, shape=(None, image_size * image_size))\n",
    "    y_ = tf.placeholder(tf.float32, shape=(None, num_labels))\n",
    "\n",
    "    w1 = tf.Variable(\n",
    "        tf.truncated_normal([image_size * image_size, hidden_layer_size]))\n",
    "    b1 = tf.Variable(tf.zeros([hidden_layer_size]))\n",
    "    y1 = tf.matmul(x, w1) + b1\n",
    "    y1_relu = tf.nn.relu(y1)\n",
    "\n",
    "    # Dropout层\n",
    "    keep_prob = tf.placeholder(tf.float32)\n",
    "    y1_drop = tf.nn.dropout(y1_relu, keep_prob=keep_prob)\n",
    "\n",
    "    w2 = tf.Variable(tf.truncated_normal([hidden_layer_size, num_labels]))\n",
    "    b2 = tf.Variable(tf.zeros([num_labels]))\n",
    "    y_pred = tf.matmul(y1_drop, w2) + b2\n",
    "\n",
    "    cross_entropy = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_pred))\n",
    "\n",
    "    l2_param = 0.001\n",
    "    cross_entropy += l2_param * (tf.nn.l2_loss(w1) + tf.nn.l2_loss(w2))\n",
    "\n",
    "    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)\n",
    "\n",
    "    correct_predicetion = tf.equal(tf.argmax(y_, 1), tf.argmax(y_pred, 1))\n",
    "    accuracy = tf.reduce_mean(tf.cast(correct_predicetion, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "step 0:\n",
      "Minibatch loss: 1139.7457275390625, accuracy: 0.3671875\n",
      "Validation accuracy: 0.2703999876976013\n",
      "--------------------------------------------------------------------------------\n",
      "step 500:\n",
      "Minibatch loss: 205.05593872070312, accuracy: 0.8671875\n",
      "Validation accuracy: 0.7411999702453613\n",
      "--------------------------------------------------------------------------------\n",
      "step 1000:\n",
      "Minibatch loss: 114.98190307617188, accuracy: 0.796875\n",
      "Validation accuracy: 0.7461000084877014\n",
      "--------------------------------------------------------------------------------\n",
      "step 1500:\n",
      "Minibatch loss: 68.18247985839844, accuracy: 0.8515625\n",
      "Validation accuracy: 0.7749000191688538\n",
      "--------------------------------------------------------------------------------\n",
      "step 2000:\n",
      "Minibatch loss: 41.27105712890625, accuracy: 0.8515625\n",
      "Validation accuracy: 0.7915999889373779\n",
      "--------------------------------------------------------------------------------\n",
      "step 2500:\n",
      "Minibatch loss: 25.101829528808594, accuracy: 0.8359375\n",
      "Validation accuracy: 0.8205000162124634\n",
      "--------------------------------------------------------------------------------\n",
      "step 3000:\n",
      "Minibatch loss: 15.393074989318848, accuracy: 0.8359375\n",
      "Validation accuracy: 0.8274999856948853\n",
      "--------------------------------------------------------------------------------\n",
      "Test accuracy: 0.9161999821662903\n",
      "sanitized_Test accuracy: 0.89405757188797\n"
     ]
    }
   ],
   "source": [
    "num_steps = 3001\n",
    "\n",
    "with tf.Session(graph=graph) as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    print(\"Initialized\")\n",
    "    for step in range(num_steps):\n",
    "        offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n",
    "\n",
    "        batch_data = train_dataset[offset:(offset + batch_size), :]\n",
    "        batch_labels = train_labels[offset:(offset + batch_size), :]\n",
    "\n",
    "        sess.run(train_step,\n",
    "                 feed_dict={\n",
    "                     x: batch_data,\n",
    "                     y_: batch_labels,\n",
    "                     keep_prob: 0.5\n",
    "                 })\n",
    "\n",
    "        if (step % 500 == 0):\n",
    "            loss, train_acc = sess.run([cross_entropy, accuracy],\n",
    "                                       feed_dict={\n",
    "                                           x: batch_data,\n",
    "                                           y_: batch_labels,\n",
    "                                           keep_prob: 0.5\n",
    "                                       })\n",
    "            print(\"step {}:\".format(step))\n",
    "            print(\"Minibatch loss: {}, accuracy: {}\".format(loss, train_acc))\n",
    "            val_acc = sess.run(accuracy,\n",
    "                               feed_dict={\n",
    "                                   x: valid_dataset,\n",
    "                                   y_: valid_labels,\n",
    "                                   keep_prob: 0.5\n",
    "                               })\n",
    "            print(\"Validation accuracy: {}\".format(val_acc))\n",
    "            print('-' * 80)\n",
    "\n",
    "    test_acc = sess.run(accuracy,\n",
    "                        feed_dict={\n",
    "                            x: test_dataset,\n",
    "                            y_: test_labels,\n",
    "                            keep_prob: 1.0\n",
    "                        })\n",
    "    print(\"Test accuracy: {}\".format(test_acc))\n",
    "\n",
    "    sanitized_test_acc = sess.run(accuracy,\n",
    "                                  feed_dict={\n",
    "                                      x: sanitized_test_dataset,\n",
    "                                      y_: sanitized_test_labels,\n",
    "                                      keep_prob: 1.0\n",
    "                                  })\n",
    "    print(\"sanitized_Test accuracy: {}\".format(sanitized_test_acc))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**少样本+`Dropout`**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "step 0:\n",
      "Minibatch loss: 849.27978515625, accuracy: 0.4921875\n",
      "Validation accuracy: 0.3375999927520752\n",
      "--------------------------------------------------------------------------------\n",
      "step 500:\n",
      "Minibatch loss: 191.95286560058594, accuracy: 0.9921875\n",
      "Validation accuracy: 0.7770000100135803\n",
      "--------------------------------------------------------------------------------\n",
      "step 1000:\n",
      "Minibatch loss: 116.4712142944336, accuracy: 1.0\n",
      "Validation accuracy: 0.7786999940872192\n",
      "--------------------------------------------------------------------------------\n",
      "step 1500:\n",
      "Minibatch loss: 70.63917541503906, accuracy: 1.0\n",
      "Validation accuracy: 0.7768999934196472\n",
      "--------------------------------------------------------------------------------\n",
      "step 2000:\n",
      "Minibatch loss: 42.8465690612793, accuracy: 1.0\n",
      "Validation accuracy: 0.7849000096321106\n",
      "--------------------------------------------------------------------------------\n",
      "step 2500:\n",
      "Minibatch loss: 25.988243103027344, accuracy: 1.0\n",
      "Validation accuracy: 0.7906000018119812\n",
      "--------------------------------------------------------------------------------\n",
      "step 3000:\n",
      "Minibatch loss: 15.761417388916016, accuracy: 1.0\n",
      "Validation accuracy: 0.7900000214576721\n",
      "--------------------------------------------------------------------------------\n",
      "Test accuracy: 0.8788999915122986\n",
      "sanitized_Test accuracy: 0.8509007692337036\n"
     ]
    }
   ],
   "source": [
    "num_steps = 3001\n",
    "\n",
    "with tf.Session(graph=graph) as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    print(\"Initialized\")\n",
    "    for step in range(num_steps):\n",
    "        # 限制训练样本的数量，1000\n",
    "        offset = (step * batch_size) % (1000 - batch_size)\n",
    "\n",
    "        batch_data = train_dataset[offset:(offset + batch_size), :]\n",
    "        batch_labels = train_labels[offset:(offset + batch_size), :]\n",
    "\n",
    "        sess.run(train_step,feed_dict={x: batch_data, \n",
    "                                       y_ :batch_labels,\n",
    "                                       keep_prob:0.5})\n",
    "        \n",
    "        if (step % 500 == 0):\n",
    "            loss, train_acc = sess.run([cross_entropy,accuracy],\n",
    "                                       feed_dict={x: batch_data, \n",
    "                                                  y_ :batch_labels,\n",
    "                                                  keep_prob:0.5})\n",
    "            print(\"step {}:\".format(step))\n",
    "            print(\"Minibatch loss: {}, accuracy: {}\".format(loss,train_acc))\n",
    "            val_acc = sess.run(accuracy,feed_dict={x: valid_dataset,\n",
    "                                                   y_: valid_labels,\n",
    "                                                   keep_prob:0.5})\n",
    "            print(\"Validation accuracy: {}\".format(val_acc))\n",
    "            print('-'*80)\n",
    "\n",
    "\n",
    "    test_acc = sess.run(accuracy,feed_dict={x: test_dataset, \n",
    "                                            y_: test_labels,\n",
    "                                            keep_prob:1.0})\n",
    "    print(\"Test accuracy: {}\".format(test_acc))\n",
    "    \n",
    "    sanitized_test_acc = sess.run(accuracy,feed_dict={x: sanitized_test_dataset, \n",
    "                                            y_: sanitized_test_labels,\n",
    "                                            keep_prob:1.0})\n",
    "    print(\"sanitized_Test accuracy: {}\".format(sanitized_test_acc))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**1000样本，相对无Dropout层，模型测试精度从 0.73 增加到 0.85**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 组合上述技巧\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "进一步提高模型精度，加深神经网络为4层，隐藏层神经元1024、640、256，使用l2正则化，Dropout，及学习速率衰减"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 128\n",
    "hidden1 = 1024\n",
    "hidden2 = 640\n",
    "hidden3 = 256\n",
    "num_labels = 10\n",
    "graph = tf.Graph()\n",
    "\n",
    "with graph.as_default():\n",
    "    global_step = tf.Variable(0)\n",
    "    learning_rate = tf.train.exponential_decay(0.08, global_step, 200, 0.98)\n",
    "\n",
    "    x = tf.placeholder(tf.float32, shape=(None, image_size * image_size))\n",
    "    y_ = tf.placeholder(tf.float32, shape=(None, num_labels))\n",
    "\n",
    "    w1 = tf.Variable(\n",
    "        tf.truncated_normal([image_size * image_size, hidden1],\n",
    "                            stddev=np.sqrt(2.0 / hidden1)))\n",
    "    b1 = tf.Variable(tf.zeros([hidden1]))\n",
    "    y1 = tf.matmul(x, w1) + b1\n",
    "    y1_relu = tf.nn.relu(y1)\n",
    "\n",
    "    # Dropout层\n",
    "    keep_prob1 = tf.placeholder(tf.float32)\n",
    "    y1_drop = tf.nn.dropout(y1_relu, keep_prob=keep_prob1)\n",
    "\n",
    "    w2 = tf.Variable(\n",
    "        tf.truncated_normal([hidden1, hidden2], stddev=np.sqrt(2.0 / hidden2)))\n",
    "    b2 = tf.Variable(tf.zeros([hidden2]))\n",
    "    y2 = tf.matmul(y1_drop, w2) + b2\n",
    "    y2_relu = tf.nn.relu(y2)\n",
    "\n",
    "    keep_prob2 = tf.placeholder(tf.float32)\n",
    "    y2_drop = tf.nn.dropout(y2_relu, keep_prob=keep_prob2)\n",
    "\n",
    "    w3 = tf.Variable(\n",
    "        tf.truncated_normal([hidden2, hidden3], stddev=np.sqrt(2.0 / hidden3)))\n",
    "    b3 = tf.Variable(tf.zeros([hidden3]))\n",
    "    y3 = tf.matmul(y2_drop, w3) + b3\n",
    "    y3_relu = tf.nn.relu(y3)\n",
    "\n",
    "    keep_prob3 = tf.placeholder(tf.float32)\n",
    "    y3_drop = tf.nn.dropout(y3_relu, keep_prob=keep_prob3)\n",
    "\n",
    "    w4 = tf.Variable(\n",
    "        tf.truncated_normal([hidden3, num_labels],\n",
    "                            stddev=np.sqrt(2.0 / num_labels)))\n",
    "    b4 = tf.Variable(tf.zeros([num_labels]))\n",
    "\n",
    "    y_pred = tf.matmul(y3_drop, w4) + b4\n",
    "\n",
    "    cross_entropy = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_pred))\n",
    "\n",
    "    l2_param = 0.001\n",
    "    cross_entropy += l2_param * (tf.nn.l2_loss(w1) + tf.nn.l2_loss(w2))\n",
    "\n",
    "    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(\n",
    "        cross_entropy)\n",
    "\n",
    "    correct_predicetion = tf.equal(tf.argmax(y_, 1), tf.argmax(y_pred, 1))\n",
    "    accuracy = tf.reduce_mean(tf.cast(correct_predicetion, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "step 0:\n",
      "Minibatch loss: 8.287750244140625, accuracy: 0.3359375\n",
      "Validation accuracy: 0.23819999396800995\n",
      "--------------------------------------------------------------------------------\n",
      "step 500:\n",
      "Minibatch loss: 1.7458031177520752, accuracy: 0.8671875\n",
      "Validation accuracy: 0.8224999904632568\n",
      "--------------------------------------------------------------------------------\n",
      "step 1000:\n",
      "Minibatch loss: 1.7253170013427734, accuracy: 0.8671875\n",
      "Validation accuracy: 0.842199981212616\n",
      "--------------------------------------------------------------------------------\n",
      "step 1500:\n",
      "Minibatch loss: 1.4736144542694092, accuracy: 0.875\n",
      "Validation accuracy: 0.8499000072479248\n",
      "--------------------------------------------------------------------------------\n",
      "step 2000:\n",
      "Minibatch loss: 1.3699597120285034, accuracy: 0.9140625\n",
      "Validation accuracy: 0.8593999743461609\n",
      "--------------------------------------------------------------------------------\n",
      "step 2500:\n",
      "Minibatch loss: 1.2833248376846313, accuracy: 0.890625\n",
      "Validation accuracy: 0.8659999966621399\n",
      "--------------------------------------------------------------------------------\n",
      "step 3000:\n",
      "Minibatch loss: 1.2800345420837402, accuracy: 0.875\n",
      "Validation accuracy: 0.8673999905586243\n",
      "--------------------------------------------------------------------------------\n",
      "Test accuracy: 0.9340000152587891\n",
      "sanitized_Test accuracy: 0.9159720540046692\n"
     ]
    }
   ],
   "source": [
    "num_steps = 3001\n",
    "\n",
    "with tf.Session(graph=graph) as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    print(\"Initialized\")\n",
    "    for step in range(num_steps):\n",
    "        offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n",
    "\n",
    "        batch_data = train_dataset[offset:(offset + batch_size), :]\n",
    "        batch_labels = train_labels[offset:(offset + batch_size), :]\n",
    "\n",
    "        sess.run(train_step,\n",
    "                 feed_dict={\n",
    "                     x: batch_data,\n",
    "                     y_: batch_labels,\n",
    "                     keep_prob1: 0.9,\n",
    "                     keep_prob2: 0.8,\n",
    "                     keep_prob3: 0.5\n",
    "                 })\n",
    "\n",
    "        if (step % 500 == 0):\n",
    "            loss, train_acc = sess.run(\n",
    "                [cross_entropy, accuracy],\n",
    "                feed_dict={\n",
    "                    x: batch_data,\n",
    "                    y_: batch_labels,\n",
    "                    keep_prob1: 0.9,\n",
    "                    keep_prob2: 0.8,\n",
    "                    keep_prob3: 0.5\n",
    "                })\n",
    "            print(\"step {}:\".format(step))\n",
    "            print(\"Minibatch loss: {}, accuracy: {}\".format(loss, train_acc))\n",
    "            val_acc = sess.run(accuracy,\n",
    "                               feed_dict={\n",
    "                                   x: valid_dataset,\n",
    "                                   y_: valid_labels,\n",
    "                                   keep_prob1: 0.9,\n",
    "                                   keep_prob2: 0.8,\n",
    "                                   keep_prob3: 0.5\n",
    "                               })\n",
    "            print(\"Validation accuracy: {}\".format(val_acc))\n",
    "            print('-' * 80)\n",
    "\n",
    "    test_acc = sess.run(accuracy,\n",
    "                        feed_dict={\n",
    "                            x: test_dataset,\n",
    "                            y_: test_labels,\n",
    "                            keep_prob1: 1.0,\n",
    "                            keep_prob2: 1.0,\n",
    "                            keep_prob3: 1.0\n",
    "                        })\n",
    "    print(\"Test accuracy: {}\".format(test_acc))\n",
    "\n",
    "    sanitized_test_acc = sess.run(accuracy,\n",
    "                                  feed_dict={\n",
    "                                      x: sanitized_test_dataset,\n",
    "                                      y_: sanitized_test_labels,\n",
    "                                      keep_prob1: 1.0,\n",
    "                                      keep_prob2: 1.0,\n",
    "                                      keep_prob3: 1.0\n",
    "                                  })\n",
    "    print(\"sanitized_Test accuracy: {}\".format(sanitized_test_acc))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set (200000, 28, 28) (200000,)\n",
      "Validation set (10000, 28, 28) (10000,)\n",
      "Test set (10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "pickle_file = '../H/datasets/notMNIST.pickle'\n",
    "\n",
    "with open(pickle_file, 'rb') as f:\n",
    "    save = pickle.load(f)\n",
    "    train_dataset = save['train_dataset']\n",
    "    train_labels = save['train_labels']\n",
    "    valid_dataset = save['valid_dataset']\n",
    "    valid_labels = save['valid_labels']\n",
    "    test_dataset = save['test_dataset']\n",
    "    test_labels = save['test_labels']\n",
    "    del save  # hint to help gc free up memory\n",
    "    print('Training set', train_dataset.shape, train_labels.shape)\n",
    "    print('Validation set', valid_dataset.shape, valid_labels.shape)\n",
    "    print('Test set', test_dataset.shape, test_labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sanitized_Validation set (7924, 28, 28) (7924,)\n",
      "sanitized_Test set (7438, 28, 28) (7438,)\n"
     ]
    }
   ],
   "source": [
    "pickle_file = '../H/datasets/sanitized_notMNIST.pickle'\n",
    "\n",
    "with open(pickle_file, 'rb') as f:\n",
    "    save = pickle.load(f)\n",
    "    sanitized_valid_dataset = save['sanitized_valid_dataset']\n",
    "    sanitized_valid_labels = save['sanitized_valid_labels']\n",
    "    sanitized_test_dataset = save['sanitized_test_dataset']\n",
    "    sanitized_test_labels = save['sanitized_test_labels']\n",
    "    del save  # hint to help gc free up memory|\n",
    "    print('sanitized_Validation set', sanitized_valid_dataset.shape,\n",
    "          sanitized_valid_labels.shape)\n",
    "    print('sanitized_Test set', sanitized_test_dataset.shape,\n",
    "          sanitized_test_labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def weight_variable(shape):\n",
    "    initial = tf.truncated_normal(shape, stddev=0.1)\n",
    "    return tf.Variable(initial)\n",
    "\n",
    "\n",
    "def bias_variable(shape):\n",
    "    initial = tf.constant(0.1, shape=shape)\n",
    "    return tf.Variable(initial)\n",
    "\n",
    "\n",
    "def conv2d(x, w):\n",
    "    return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')\n",
    "\n",
    "\n",
    "def max_pool_2x2(x):\n",
    "    return tf.nn.max_pool(x,\n",
    "                          ksize=[1, 2, 2, 1],\n",
    "                          strides=[1, 2, 2, 1],\n",
    "                          padding='SAME')\n",
    "\n",
    "\n",
    "def conv_layer(input_, shape):\n",
    "    w = weight_variable(shape)\n",
    "    b = bias_variable([shape[3]])\n",
    "    return tf.nn.relu(conv2d(input_, w) + b)\n",
    "\n",
    "\n",
    "def full_layer(input_, size):\n",
    "    insize = int(input_.get_shape()[1])\n",
    "    w = weight_variable([insize, size])\n",
    "    b = bias_variable([size])\n",
    "    return tf.matmul(input_, w) + b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: Logging before flag parsing goes to stderr.\n",
      "W0906 21:02:40.095162 140675052750656 deprecation.py:506] From <ipython-input-5-548515ad18a4>:25: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n",
      "W0906 21:02:40.147999 140675052750656 deprecation.py:323] From <ipython-input-5-548515ad18a4>:33: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See `tf.nn.softmax_cross_entropy_with_logits_v2`.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "image_size = 28\n",
    "batch_size = 128\n",
    "num_labels = 10\n",
    "graph = tf.Graph()\n",
    "\n",
    "with graph.as_default():\n",
    "\n",
    "    #     global_step = tf.Variable(0)\n",
    "    #     learning_rate = tf.train.exponential_decay(0.08, global_step, 200, 0.98)\n",
    "\n",
    "    x = tf.placeholder(tf.float32, shape=[None, 28, 28, 1])\n",
    "    y = tf.placeholder(tf.float32, shape=[None, 10])\n",
    "    keep_prob = tf.placeholder(tf.float32)\n",
    "\n",
    "    conv1 = conv_layer(x, shape=[5, 5, 1, 16])\n",
    "    conv1_pool = max_pool_2x2(conv1)\n",
    "\n",
    "    conv2 = conv_layer(conv1_pool, shape=[5, 5, 16, 32])\n",
    "    conv2_pool = max_pool_2x2(conv2)\n",
    "\n",
    "    conv3 = conv_layer(conv2_pool, shape=[5, 5, 32, 64])\n",
    "    conv3_pool = max_pool_2x2(conv3)\n",
    "\n",
    "    conv3_flat = tf.reshape(conv3_pool, [-1, 4 * 4 * 64])\n",
    "    conv3_drop = tf.nn.dropout(conv3_flat, keep_prob=keep_prob)\n",
    "\n",
    "    full_1 = tf.nn.relu(full_layer(conv3_drop, 256))\n",
    "    full1_drop = tf.nn.dropout(full_1, keep_prob=keep_prob)\n",
    "\n",
    "    y_pred = full_layer(full1_drop, 10)\n",
    "\n",
    "    cross_entropy = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_pred))\n",
    "\n",
    "    train_step = tf.train.AdamOptimizer(1e-3).minimize(cross_entropy)\n",
    "\n",
    "    correct_predicetion = tf.equal(tf.argmax(y, 1), tf.argmax(y_pred, 1))\n",
    "    accuracy = tf.reduce_mean(tf.cast(correct_predicetion, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_labels = (np.arange(num_labels) == train_labels[:, None]).astype(\n",
    "    np.float32)\n",
    "valid_labels = (np.arange(num_labels) == valid_labels[:, None]).astype(\n",
    "    np.float32)\n",
    "test_labels = (np.arange(num_labels) == test_labels[:, None]).astype(\n",
    "    np.float32)\n",
    "sanitized_test_labels = (\n",
    "    np.arange(num_labels) == sanitized_test_labels[:, None]).astype(np.float32)\n",
    "\n",
    "train_dataset = train_dataset.reshape([-1, 28, 28, 1]).astype(np.float32)\n",
    "valid_dataset = valid_dataset.reshape([-1, 28, 28, 1]).astype(np.float32)\n",
    "test_dataset = test_dataset.reshape([-1, 28, 28, 1]).astype(np.float32)\n",
    "sanitized_test_dataset = sanitized_test_dataset.reshape([-1, 28, 28,\n",
    "                                                         1]).astype(np.float32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(200000, 28, 28, 1)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_dataset.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initialized\n",
      "step 0:\n",
      "Minibatch loss: 4.723496437072754, accuracy: 0.15625\n",
      "Validation accuracy: 0.09640000015497208\n",
      "--------------------------------------------------------------------------------\n",
      "step 500:\n",
      "Minibatch loss: 0.3868594169616699, accuracy: 0.8828125\n",
      "Validation accuracy: 0.8464999794960022\n",
      "--------------------------------------------------------------------------------\n",
      "step 1000:\n",
      "Minibatch loss: 0.4229097366333008, accuracy: 0.8984375\n",
      "Validation accuracy: 0.8705000281333923\n",
      "--------------------------------------------------------------------------------\n",
      "step 1500:\n",
      "Minibatch loss: 0.34943389892578125, accuracy: 0.890625\n",
      "Validation accuracy: 0.8756999969482422\n",
      "--------------------------------------------------------------------------------\n",
      "step 2000:\n",
      "Minibatch loss: 0.3830106854438782, accuracy: 0.875\n",
      "Validation accuracy: 0.8823000192642212\n",
      "--------------------------------------------------------------------------------\n",
      "step 2500:\n",
      "Minibatch loss: 0.28562355041503906, accuracy: 0.890625\n",
      "Validation accuracy: 0.8888999819755554\n",
      "--------------------------------------------------------------------------------\n",
      "step 3000:\n",
      "Minibatch loss: 0.4291870594024658, accuracy: 0.8828125\n",
      "Validation accuracy: 0.892300009727478\n",
      "--------------------------------------------------------------------------------\n",
      "Test accuracy: 0.955299973487854\n",
      "sanitized_Test accuracy: 0.943533182144165\n"
     ]
    }
   ],
   "source": [
    "num_steps = 3001\n",
    "\n",
    "with tf.Session(graph=graph) as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    print(\"Initialized\")\n",
    "    for step in range(num_steps):\n",
    "        offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n",
    "\n",
    "        batch_data = train_dataset[offset:(offset + batch_size)]\n",
    "        batch_labels = train_labels[offset:(offset + batch_size)]\n",
    "\n",
    "        sess.run(train_step,\n",
    "                 feed_dict={\n",
    "                     x: batch_data,\n",
    "                     y: batch_labels,\n",
    "                     keep_prob: 0.5\n",
    "                 })\n",
    "\n",
    "        if (step % 500 == 0):\n",
    "            loss, train_acc = sess.run([cross_entropy, accuracy],\n",
    "                                       feed_dict={\n",
    "                                           x: batch_data,\n",
    "                                           y: batch_labels,\n",
    "                                           keep_prob: 0.5\n",
    "                                       })\n",
    "            print(\"step {}:\".format(step))\n",
    "            print(\"Minibatch loss: {}, accuracy: {}\".format(loss, train_acc))\n",
    "            val_acc = sess.run(accuracy,\n",
    "                               feed_dict={\n",
    "                                   x: valid_dataset,\n",
    "                                   y: valid_labels,\n",
    "                                   keep_prob: 0.5\n",
    "                               })\n",
    "            print(\"Validation accuracy: {}\".format(val_acc))\n",
    "            print('-' * 80)\n",
    "\n",
    "    test_acc = sess.run(accuracy,\n",
    "                        feed_dict={\n",
    "                            x: test_dataset,\n",
    "                            y: test_labels,\n",
    "                            keep_prob: 1.0\n",
    "                        })\n",
    "    print(\"Test accuracy: {}\".format(test_acc))\n",
    "\n",
    "    sanitized_test_acc = sess.run(accuracy,\n",
    "                                  feed_dict={\n",
    "                                      x: sanitized_test_dataset,\n",
    "                                      y: sanitized_test_labels,\n",
    "                                      keep_prob: 1.0\n",
    "                                  })\n",
    "    print(\"sanitized_Test accuracy: {}\".format(sanitized_test_acc))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**CNN模型，测试精度达到 94.35%**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "260px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
